UART串行通信模式
UART串行通信模式
- What
- How
- 舉例
- Task
- sao話一下
What
??單片機可以與其他機器(像上位機,我們所用的上位機就是我們的PC)進行數(shù)據(jù)之間的傳輸也就是通信。而通信具有不同的通信模式,這一節(jié)主要討論單片機(MSP430)的UART通信模式。
MSP430G2553只有一個USCI_A0和USCI_B0模塊
??UART通信模式是一種異步串行通信模式。所謂異步,就是收發(fā)雙方的時鐘并不同步,發(fā)送方以一定的方式發(fā)出數(shù)據(jù),接收方也以類似的方式接收數(shù)據(jù),對數(shù)據(jù)的傳輸及發(fā)送時間沒有要求,而同步通信模塊需要收發(fā)雙方時鐘相同,接收和發(fā)送有時鐘要求;所謂串行通信模式直觀理解就是通信只有一條道路,數(shù)據(jù)位按順序依次通過,而并行通信模式就是有多條道路,數(shù)據(jù)位并排一起過去。
??UART典型數(shù)據(jù)格式如下
??其他內(nèi)容參考手冊相關(guān)部分內(nèi)容。再寫我怕寫錯了。
How
當UCSYNC位被清零時USCI就選擇了UART模式。
管腳配置
時鐘源配置
時鐘選擇
波特率配置
中斷配置,中斷函數(shù)編寫
LaunchPad在進行串口通信時需要將RXD和TXD兩列的跳線帽橫插。
舉例
串口(使用USART2,TX為PA2,RX為PA3),發(fā)送0x55顯示在上位機串口助手上(波特率9600)
#include "io430.h" void Delay_ms(unsigned cnt) {unsigned int i,j;for(j=0;j<cnt;j++){i=1000/6;while(i--);} } void InitUART(void) {//復位USCI_AxUCA0CTL1|=UCSWRST;//選擇USCI_Ax為UART模式UCA0CTL0&=~UCSYNC;//配置UART時鐘源為SMCLKUCA0CTL1|=UCSSEL1;//配置波特率為9600UCA0BR0=104;UCA0BR1=0;UCA0MCTL=1<<1;//使能端口復用P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;//清除復位,使能UARTUCA0CTL1&=~UCSWRST; } void InitSystemClock(void) {//配置DCO為1MHzDCOCTL=CALDCO_1MHZ;BCSCTL1=CALBC1_1MHZ;//配置SMCLK的時鐘源為DCOBCSCTL2&=~SELS;//設(shè)置SMCLK的分頻系數(shù)為1BCSCTL2&=~(DIVS0|DIVS1); } int main( void ) {// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;InitSystemClock();InitUART();while(1){UCA0TXBUF=0x55;Delay_ms(1000);} }UART串口通信發(fā)送0x55至上位機
Task
將接收的上位機數(shù)據(jù)取反后再發(fā)送到串口助手上。(波特率9600)
#include "io430.h" #include "stdint.h" /* @fn: void InitUART(void)@brief: 初始化串口,包括設(shè)置波特率,數(shù)據(jù)位,校驗位等@para: none@return: none@comment: 初始化串口 */ void InitUART(void) {//復位USCI_AxUCA0CTL1|=UCSWRST;//選擇USCI_Ax為UART模式UCA0CTL0&=~UCSYNC;//配置UART時鐘源為SMCLKUCA0CTL1|=UCSSEL1;//配置波特率為9600UCA0BR0=104;UCA0BR1=0;UCA0MCTL=1<<1;//使能端口復用P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;//清除復位,使能UARTUCA0CTL1&=~UCSWRST;//接收中斷啟用IE2|=UCA0RXIE;//清空接收中斷標志位IFG2&=~UCA0RXIFG; } /* @fn: void InitSystemClock(void)@brief: 初始化系統(tǒng)時鐘@para: none@return: none@comment: 初始化系統(tǒng)時鐘 */ void InitSystemClock(void) {//配置DCO為1MHzDCOCTL=CALDCO_1MHZ;BCSCTL1=CALBC1_1MHZ;//配置SMCLK的時鐘源為DCOBCSCTL2&=~SELS;//設(shè)置SMCLK的分頻系數(shù)為1BCSCTL2&=~(DIVS0|DIVS1); }int main( void ) {// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;InitSystemClock();InitUART();P1DIR|=BIT0;//用于查看程序是否正常運行P1OUT|=BIT0;__bis_SR_register(LPM0_bits+GIE); }#pragma vector=USCIAB0RX_VECTOR __interrupt void UART_Receive_ISR(void) {while (!(IFG2&UCA0TXIFG)); // 檢測發(fā)送是否準備好UCA0TXBUF = ~UCA0RXBUF; // 將接收數(shù)據(jù)發(fā)送給主機 }UART接收取反發(fā)送
sao話一下
為眾人抱薪者,不可使其扼于風雪。為自由開路者,不可使其困于荊棘。即使我們不是抱薪開路之人,也應該多一些善良。
總結(jié)
以上是生活随笔為你收集整理的UART串行通信模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lambda从入门到精通(一篇搞懂)
- 下一篇: 如何分辨及举报钓鱼网站/诈骗网站