历史上的今天
今天是:2025年04月20日(星期日)
2021年04月20日 | MSP430F2616开发笔记之UART Mode from SMCLK
2021-04-20 来源:eefocus
几乎所有的单片机都会集成UART外设,但是调试MSP430的UART功能比想象的要有挑战性也更有乐趣。MSP430的UART外设提供了更丰富的硬件可定制性,允许用户使用更简洁的代码和更少的外围器件,实现非常实用的功能,比如address选择、break信号、baudrate自动检测等等。当然,UART外设有丰富的时钟选项,32.768KHZ的ACLK时钟源也可以被使用,CPU可以最大限度的处于未唤醒状态,这是为低功耗而考虑的设计。
(USI外设:Universal Serial Interface,提供这一功能的MSP430型号并不多,在调试它之前得先确认是否具备它,MSP430F2616不提供USI外设,所以直接从USCI开始。)
USCI外设:Universal Serial Communication Interface,大部分单片机会将UART、SPI、I2C外设功能分开,它们通常会使用不一样的IO引脚,不共用寄存器和中断向量;MSP430将这些外设功能集成到USCI中,它支持不同的(UART、SPI、I2C)模式,不同模式之间虽然不共用IO引脚,但是却共用寄存器和中断向量。USCI之间以不同的字母后缀来命名,比如USCI_A和USCI_B;如果有两个USCI_A,则命名为USCI_A0和USCI_A1。
其中,USCI_Ax支持UART、SPI、IrDA模式。如果需要使用UART功能,就需要设置USCI_Ax对应的IO引脚、寄存器和中断服务程序。相应的,USCI包含的SPI功能也就无法再使用。
这里UART使用的时钟是SMCLK(MCLK不能作为UART的时钟,而只能从UCLK(?)、ACLK、SMCLK中选择),默认的SMCLK来自DCOCLK,也就是MSP430自带的Digitally Controlled Oscillator时钟,IO引脚使用的是P3.4/P3.5,从数据手册可以看到它们是UART外设的专用引脚。将波特率设置为9600,分频值在数据手册中有表可查。
由于UART的接受通常使用中断,所以这里还要使能全局中断和UART接收中断。
/**********************************************************************/
uint32_t uart_rx_count = 0;
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
dma_temp_A[0] = UCA0RXBUF;
uart_rx_count++;
HC595_disdata_4bytes(uart_rx_count);
}
int main (void)
{
uint16_t i = 0;
WDTCTL = WDTPW + WDTHOLD;
// 等待DCOCLK稳定,并且将它调整为1MHz,而系统启动时的默认值是1.1MHz
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF)
while(1);
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
// 开启全局中断
__bis_SR_register(GIE);
led_init();
HC595_init();
// 首先关断UART
// 选择时钟为SMCLK
// UCA0BR0、UCA0BR、UCA0MCTL的值在9600波特率,可查询技术手册提供的表格
UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 = 104;
UCA0BR1 = 0;
UCA0MCTL = (0 << 4) + (1 << 1);
// 设置IO口的外设功能
// 启动UART
// 使能UART的接收中断
P3SEL = 0x30;
UCA0CTL1 &= ~UCSWRST;
IE2 |= UCA0RXIE;
while (1) {
for (i = 'A'; i <= 'Z'; i++) {
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = i;
}
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = 'r';
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = 'n';
}
return 0;
}
/********************************************************************/
MSP430的技术手册提供了不同波特率对应的寄存器表格,观察这个表格就会发现,以1MHz的SMCLK作为时钟源时,115200波特率实际上会有一个不可忽视的误差值,在实际应用中可能要注意它带来的影响。
当使用串口调试软件发送数据时,中断服务程序就会将当前接收到的个数显示在74HC595驱动的4位数码管上面。串口和液晶由于显示事件比较长,并不适合放进中断服务程序,实际上,显示4位8段数码管也需要不短的时间,因此在中断函数中写标志位、在主函数中显示,还是更加合理的选择。
史海拾趣
|
Spartan-6 and Virtex-6 FPGA Embedded Kit FAQ 1. Where can I purchase an Embedded kit? 2. How much do the Spartan-6 and Virtex-6 FPGA Embedded Kits cost? 3. When will I get my kit? 4. What are included in the Embedded Kits? 5. What expansion ports are avail ...… 查看全部问答> |
|
开发平台是vs2005下vc++下的智能设备开发 三星s2440下的wince平台 屏幕显示分辨率为800*600 在中文版本下应用程序可以全屏显示,但是到了英文平台,只能显示出程序的一部分内容,感觉像是应用程序的分辨率变小了 如果换成vs2005下C#下的智能设备 ...… 查看全部问答> |
|
系统wince5.0,2440硬件平台,修改了/kernel/hal/arm/fw.s文件后,在pb5.0上编译后整个系统都跑不起来,同样目录下的c文件修改后编译就没有问题,不知是什么原因,后来在PB4.2下编译好fw.s文件,直接把编译好的fw.obj copy到5.0里链接, ...… 查看全部问答> |
|
是BPB还是FAT或FDT的损坏? 除了硬件损坏,文件系统突然断电会有什么样的写入错误造成存贮设备不可用吗? 一般的文件系统如果是先写数据,再记录FAT和FDT会提高保护的可能性吗。… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:38 编辑 请大家帮忙,在C64x的EMIF在SDRAM接口中,如何通过BE[7:0]实现8bit、16bit、32bit、64bit的寻址方式? … 查看全部问答> |
|
现在正在做一个板子,需要做HSMC接口。可是网上找不到资料,ALTERA公司网站也没有。看到你们这边做示波器2.0中用到了这个接口,想跟你们求助一下,看看有没有封装等资料能共享一下,谢谢了……… 查看全部问答> |




