学习LPC17xx – SysTick和RIT
- 进入中断后一定要取消标志位。RIT_GetIntStatus(LPC_RIT)就是干这事的。
- 固件库中用到的RITx全部是LPC_RIT
- RITENBR寄存器(调试的时候让定时器停下来)是指调试时按Stop。
- 在Watch窗口里面看寄存器要加”`”,就像”`RICOUNTER”。
- 所有寄存器都在Symbols窗口里面有。
- 功率控制默认是关闭的。
- 时钟可以PCLKSEL#寄存器中设置。
#include <lpc17xx.h> #include "lpc17xx_libcfg.h" #include <debug_frmwrk.h> #include <lpc17xx_nvic.h> #include <lpc17xx_systick.h> #include <lpc17xx_rit.h> void SysTick_Handler(void) { static uint32_t t; ++ t; if (!(t % 10)) _DBG_("SysTick IRQ"); } void RIT_IRQHandler(void) { RIT_GetIntStatus(LPC_RIT); _DBG_("RIT IRQ"); } int main(void) { debug_frmwrk_init(); SYSTICK_InternalInit(100); //the maximum value should not exceed the 24 bit systick counter SYSTICK_Cmd(ENABLE); SYSTICK_IntCmd(ENABLE); RIT_Init(LPC_RIT); RIT_TimerConfig(LPC_RIT, 500); //100ms RIT_TimerDebugCmd(LPC_RIT, DISABLE); NVIC_EnableIRQ(RIT_IRQn); while(1); } |
学习LPC17xx – 定时器
定时器部分的固件库有Bug,具体为作为计数器模式的时候固件库工作不正常,检查代码后发现有几处错误,此问题已反馈给NXP。
- PCLK默认是CCLK四分频,固件库初始化时会修改为四分频,所以需要改变PCLK的分频应当在用固件库初始化之后。
- 这里的GetIntStatus是不会清空挂起位的。这与RIT不同。
- 固件库对Counter模式有很多错误,固件库手册描述不清等。
- 固件库中[320行附近]:CCR和CTCR混淆,TIM_TIMER_MODE应为TimerCounterMode。
- TIM_COUNTERCFG_Type的说明在另外一处,Init函数接受的第三个参数为void*,具体类型通过第二个参数选择。TIM_COUNTERCFG_Type说明处有错误。事实上第一个元素没用到,第二个参数的描述应为第一个参数。
- 固件库中[344行附近]:CCR和CTCR混淆。
- 头文件[142行附近]还有对参数检查的错误,把计数器模式的下降沿和任意边沿都写成了上升沿。
- 固件库中应该还有错误,比如GetIntStatus和GetIntCaptureStatus函数。
- 要记得引脚选择。
- 有空要调试好固件库。
以下代码分别为使用定时器0和2、捕获输入、计数器模式(需要修改固件库)。
阅读更多
学习LPC17xx – GPIO和EXTI
以下是GPIO和EXTI的调试笔记:
- 所有引脚使用前必须初始化(一般来说GPIO除外)。包括EXTI。
- GPIO需要设置方向、输出等。通过SetValue和ClearValue就可以了。FIO打头的函数貌似是为了兼容以前的。
- EINT0是通过PINSEL使能的,PCONP中没有对应位。
- NVIC的控制是在core_cm3.h中定义的。SysTick既有LPC17xx的驱动库,也在CMSIS中就有定义。
- 中断使用前要通过NVIC使能中断。
- 进入中断后要清除中断标志位。
- 中断后Pending位自动清零(当中断变为Active后),但标志位不会。
- SysTick的溢出时间不能超过24位寄存器。
- 即使没有使能NVIC中对应的中断,当其触发时,仍然会变成Pending。
- SysTick不能用NVIC控制。
- 注意看手册,GPIO中断一次是设置一批的。
- 消抖:群里有人说不要用外部中断。进入中断后判断端口的电平。计数,到一定阈值以上才算真正触发。(但是这种办法在外部中断(EINT/EXTI)中可能无法实现)
- SysTick的时钟固定为CCLK。
学习LPC17xx – 调试框架
正如这篇日志里所说,最近在学习LPC17xx单片机。这是一款基于ARM Cortex M3的单片机,片上资源丰富。当然所谓学习,也并没有多少的深入,只能说是浅尝辄止,为以后的深入学习作点点铺垫罢了。
NXP公司提供了一个代码库,可以在这里下到。尽管我觉得它的命名不统一,甚至还有Bug(以后会提到)。然而用厂商提供的固件库开发是大势所趋。所以在读用户手册了解各个寄存器的基础上,我还是决定用代码库来操作。
所谓开发必定要有方便的调试输出,总不能所有内容都用watch去看吧。我的开发板上有一块彩色的带有触摸屏的LCD,然而它的操作太高级了,不适合入门。万幸固件库中提供了一个debug_frmwrk的头文件,调用它的函数可以初始化UART0(或1)为调试输出端口,也定义了一些宏,方便的输出字符串、字符、数字(8、16、32位十进制或十六进制),还带有输入字符的宏,还提供了一个类似于assert的宏。不过这个库本身就是为调试方便所设立,可能不带缓冲甚至是阻塞的(blocking)。作为测试,我的代码如下:
#include "LPC17xx.h" #include "debug_frmwrk.h" #include "lpc17xx_libcfg.h" int main() { uint8_t i8 = 12; uint16_t i16 = 1234; uint32_t i32 = 12345678; char chr; debug_frmwrk_init(); _DBG("_DBG() Test"); _DBG_("_DBG_() Test"); _DBC('A'); _DBC('\n'); _DBD(i8); _DBC('\n'); _DBD16(i16); _DBC('\n'); _DBD32(i32); _DBC('\n'); _DBH(i8); _DBC('\n'); _DBH16(i16); _DBC('\n'); _DBH32(i32); _DBC('\n'); while(chr = _DG) { _DBC(chr); CHECK_PARAM(chr - 'X'); } while(1); } |
PC端的串口调试工具推荐Terminal,在这里可以下到,可能需要梯子。在本站的文件下载里面也有。
翻小墙下视频
上学期看了MIT的18.01 Single Variable Calculus,下学期该看18.02 Multivariable Calculus了。虽然配合迅雷无敌的离线下载从电驴上不费吹灰之力把它搞了下来,但觉得很不清晰。而在MIT网站上看到一个文件更大的版本(实践证明分辨率是一样的)于是准备把它下下来。
MIT网站上找到的网址是http://www.archive.org/details/MIT18.02F07。点进去果断没用,因为archive.org太强大了于是被墙了。果断搬着梯子翻出去(推荐MSNVPN买计时的,几块钱不管次数还省得每次找东西麻烦),然后用迅雷开下。速度稳定在180K左右。偶然断了VPN,却发现迅雷还在下!而且速度飙到了400K左右。猜测大概是因为墙的是DNS,所以解析之后不受影响。
其实昨天在尝试的时候还发现了另外一种办法,就是用可以远程下载的网盘先转存,然后从网盘拖下来。这样的网盘包括fileserve等。但问题是如果不是高级用户,这种付费网盘下起来很慢。然而有钱能使鬼推磨,taobao上有各种奇葩的人,你可以找苦力帮你下,或者用几个钢蹦去买个高级账户。问题就都解决了。
但是让我失望的是,下下来的东西,除了比特率高一点,分辨率是一样的,音频比特率还要低。很无语。
2011-02-09添加:
最终解决了这个问题,发现youtube也有18.02的视频,而且比较清晰。在网上的教程的帮助下,用keephd和orbit downloader全都下了下来,当然是要翻墙出去下的,MSNVPN的计时,花了大约10小时,算起来也好几块钱了。分辨率是480×360,前面有几集是640×480。这还算不错,总算勉强能看了。想要的童鞋可以联系我。
