一个人的角落,也许并没人会看到这里~~ 祝福你,工作顺心,学习快乐~

MSP432 使用Timer_A输出PWM

Timer_A 输出 PWM的问题

在官方例程中给出的是一种直接操作寄存器的方式启动的,这让我们这些刚刚接触MSP432这种嵌入式芯片的来说是很难看懂的,然而PWM的输出是可以重新映射到其它端口输出的,例程中又掺杂了PMAP GPIO端口的映射,这更使得学习无从下手。

通过寄存器操作的方式输出PWM波形

    TIMER_A0->CCR[0] = PWM_PERIOD;
    TIMER_A0->CCTL[1] = TIMER_A_CCTLN_OUTMOD_7;      // CCR1 Reset/set
    TIMER_A0->CCR[1] = PWM_PERIOD * (55 / 100.0);    // CCR1 PWM duty cycle
    TIMER_A0->CTL = TIMER_A_CTL_SSEL__SMCLK // 使用SMCLK时钟源
                  | TIMER_A_CTL_MC__UP   
                  | TIMER_A_CTL_CLR;  // SMCLK, up mode, clear TAR

引用msp432p401r.h头文件定义:

#define TIMER_A_CTL_MC__UP    ((uint16_t)0x0010)    /*!< Up mode: Timer counts up to TAxCCR0 */

通过 动态修改 TIMER_A0->CCR[1] 内容可以改变PWM间隔时间

通过DriverLib操作的方式输出PWM波形

/* Timer_A PWM Configuration Parameter */
Timer_A_PWMConfig pwmConfig =
{
    TIMER_A_CLOCKSOURCE_SMCLK,
    TIMER_A_CLOCKSOURCE_DIVIDER_1,
    32000,
    TIMER_A_CAPTURECOMPARE_REGISTER_1,
    TIMER_A_OUTPUTMODE_RESET_SET,
    3200
};
Timer_A_generatePWM(TIMER_A1_BASE, &pwmConfig);

Timer_A_setCompareValue(TIMER_A2_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, PWM_PERIOD * (50/100.0f)); //动态设置PWM 间隔时间

而timer_a.C文件中对Timer_A_generatePWM函数定义如下

void Timer_A_generatePWM(uint32_t timer, const Timer_A_PWMConfig *config)
{
    //此处省略一部分,参数合法判断...

    privateTimer_AProcessClockSourceDivider(timer, config->clockSourceDivider);

    TIMER_A_CMSIS(timer)->CTL &=
            ~(TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK + TIMER_A_UPDOWN_MODE
                    + TIMER_A_DO_CLEAR + TIMER_A_TAIE_INTERRUPT_ENABLE);

    TIMER_A_CMSIS(timer)->CTL |= (config->clockSource + TIMER_A_UP_MODE
            + TIMER_A_DO_CLEAR);

    TIMER_A_CMSIS(timer)->CCR[0] = config->timerPeriod;

    TIMER_A_CMSIS(timer)->CCTL[0] &= ~(TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE
            + TIMER_A_OUTPUTMODE_RESET_SET);

    uint8_t idx = (config->compareRegister>>1) - 1;
    TIMER_A_CMSIS(timer)->CCTL[idx] |= config->compareOutputMode;
    TIMER_A_CMSIS(timer)->CCR[idx] = config->dutyCycle;
}

可以看到相关操作与寄存器类似,但一次只能修改一路PWM输出。难怪官方例程中直接使用寄存器操作,多路输出更加容易控制。

MSP432中GPIO中断相关操作

GPIO的P1,P2,PA支持中断

MSP432 中的中断相关寄存器 PxIFG 中断标志寄存器 PxIV 中断向量寄存器

Driverlib 所涉及到GPIO中断的函数

GPIO_registerInterrupt GPIO_unregisterInterrupt //Registers/UnRegister s an interrupt handler for the port interrupt. GPIO_disableInterrupt GPIO_enableInterrupt GPIO_getEnabledInterruptStatus GPIO_interruptEdgeselect GPIO_getInterruptStatus GPIO_clearInterruptFlag

![GPIO_IES寄存器][/post_res/GPIO_IES.png]

![GPIO_PxIFG寄存器][/post_res/GPIO_PxIFG.png]

![GPIO_PxIV寄存器][/post_res/GPIO_PxIV.png]

对中断的配置

/* Confinguring P1.1 & P1.4 as an input and enabling interrupts */
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
MAP_GPIO_interruptEdgeSelect(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4, GPIO_HIGH_TO_LOW_TRANSITION);

linux下更新ibus-wubi输入法词库

参考 ubuntu Wiki:https://wiki.ubuntu.com.cn/IBus

IBus 全称 Intelligent Input Bus是下一代输入法框架(或者说“平台”)。 项目现托管于 Google Code - https://code.google.com/p/ibus/ 此项目包含了世界多数语言的文字输入需求——由世界多个国家开发者维护。

虽然世界上有那么多人在维护IBus,然而相对于国内的输入法市场,也算是相形见绌了。

输入法默认提供的词库,并没有经过人性化的处理,大部分异体字,以及不常用的词语,还有各类流行短语,比如“跑路”、“静静”、“微博”,部分字词还停还停留在上个世纪的感觉,

所以不得不变回我的Win7从QQ Wubi设置里边导出了一份txt格式的默认词库。(不得不说,腾讯的产品就剩下这点儿清白了)

使用STM32可编程芯片的制作的机械键盘主控

曾经是去年四月的想法,自定义一把顺手的机械键盘,终于到了今年暑期才完成,可怕的拖延症。

然而并不是像想象的那么简单,拿到手的是一把 JAGOR TITON 100 ,由于键盘主控制器与轴板是可分离的连接方式,才有了这个想法。

这其中所要经历的工作有:主控芯片的选择,设计键盘主控制器PCB,为其焊接可编程芯片,开发主控代码,完全拆卸键盘结构,重新焊接键盘轴体和布局背光灯。

芯片选择至关重要,最终找到了一块引脚数量足够多,而且又不缺Demo的Stm32f103c8t6。

将芯片所有多功能引脚全改为IO引脚,其中8个IO作为外部中断使用的列矩阵引脚,其余做为行矩阵引脚,留出多余的用作LED指示灯。

PCB板的设计大小长宽不能超过50*13mm,使用芯片的最小核心Demo,研究了一番,将多余芯片功能去掉,最后根据轴板IC座引脚功能,调整芯片和电容电阻位置以达到最大化的引脚对应和最少的线路穿插(AD提供鸡肋的组件布局自动化浪费了半天的时间,最后还是手动布局比较靠谱)。最后将设计文档交给华强北的PCB打印厂,50包邮搞定~

接着是将从taobao买到的STM芯片焊到PCB上,没有专业的工具,多用一些松香增加锡的张力,一支尖角电烙铁也可以搞定。

轴板拆缷要借助吸锡器来完成,像PCB这类除了第一次生产之后,永不变动的东西,要再进行二次焊接的话,焊盘很容易脱落,所以改轴和灯光部分需要一次完成。

Linux下各种修改GTK主题的方法

X为了提供更加灵活桌面的实现,使得Linux下桌面环境比较繁杂,这也衍生出众多Coder对自己Linux桌面进行定制的程序。有功能全面的Desktop Env,比如GNOME,KDE,LightDM,也有轻量功能强大的Window Manage,比如owesome,dwm。

在图形桌面环境下,各个Desktop Env都提供了相应对自身主题的修改,比如gnome-tweak-tool、unity-tweak-tool,通过修改Shell Theme可以切换不同的主题。

命令行下的修改可以通过 gsettings set org.gnome.desktop.interface gtk-theme “Mytheme” 来完成。

Linux发行版安装之后会默认自带部分主题,更多好看的可以在 Gnome LookKDE Look 下载。

主题的安装,一般将主题包下载解压至/usr/share/themes/ 或~/.local/share/themes/下即可被各种Tweak程序检测到。

但是,以上方法仅仅是对相应Desktop Env下主题的修改。一旦更换了桌面环境或者窗口管理器,这些效果将消失。

其实,GTK本身提供修改主题的方法:

一、可以通过修改程序运行时环境参数GTK_THEME来临时修改单个程序的主题,比如运行使用Adwaita:light替代Ubuntu下Firefox的橘红色主题:env GTK_THEME=Adwaita:light firefox

二、可以通过修改/etc/gtk-3.0/settings.ini~/.config/gtk-3.0/settings.ini文件中gtk-theme-name项,进行全局修改。

此外,文件还提供了icon图标以及sound声音的修改。

在Ubuntu 17.04 下DWM的安装

比较简单的安装方法莫过于通过apt来安装了。

sudo apt-get install dwm

这样的安装方式,虽然提供了四种不同的已经配置好的dwm.default dwm.maintainer dwm.web dwm.winky,但相对于dwm的自定义空间基本上是没有的,毕竟dwm的自定义是通过源码重新编译来完成的。

DWM的源码可以从作者的SuckLess网站下载,网站也提供了一些简单的使用方法,对于一般人来说也足够了。

下载解压至相应路径即可以进行,make install

注意,由于新版本的freetype2库的改动,

需要更新config.mk文件,将中下面两行进行注释:

#OpenBSD (uncomment)

FREETYPEINC = ${X11INC}/freetype2

即启用FREETYPEINC = /usr/include/freetype2

如果还缺少其它头文件,可以利用apt-file search youfile.h进行查找,并安装相应软件包。

如果make install成功。此时,dwm已经被安装到/usr/local/bin目录下。

参照:CustomXSession Ubuntu下标准自定义session的配置方法。

在~/.xinitrc 文件中定入以下内容:


#!/bin/bash

# enable ibus
export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export QT4_IM_MODULE=ibus
export CLUTTER_IM_MODULE=ibus
export XMODIFIERS=@im=ibus



exec /usr/local/bin/dwm

重启Ubuntu即可在登录选项中看到预先设置dwm选项。

此外,也可以在命令行界面下执行startx命令启动dwm。

两个月没写东西了,总结一下这些天都做了些什么吧

上一篇还是 6月的事了,6月20号开完毕业典礼,24号就回家了。那天下着大雨,每走一步,都希望留下些什么,但好像什么也没有留下。

原计划,两个月把Linux内核完全注解看懂,但由于Linux不熟悉和不了解386架构,一直在徘徊中前进。

一星期给机械键盘改键改灯

了解了Linux下X的工作机制。

把Fedora换成了Ubuntu 在Ubuntu下安装了Gnome,没然又将桌面换成了DWM。

CF给上海区,升到了大师6。

其它小事若干。