欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 29745|回復(fù): 3
收起左側(cè)

STM8L的USART1串口通信詳解 含例程

[復(fù)制鏈接]
ID:140343 發(fā)表于 2016-10-10 00:57 | 顯示全部樓層 |閱讀模式
STM8L除了可以進(jìn)行串口通信,還可支持紅外通信,智能卡協(xié)議,這些功能后續(xù)會(huì)開(kāi)發(fā),發(fā)布程序源碼。STM8L還可以使用DMA緩存數(shù)據(jù),減少CPU負(fù)擔(dān),為了簡(jiǎn)單起見(jiàn),本文沒(méi)有用到DMA功能。

只需要簡(jiǎn)單的配置發(fā)送的字長(zhǎng)度,停止位數(shù),波特率,打開(kāi)發(fā)送接收,就可以進(jìn)行串口數(shù)據(jù)收發(fā)。下圖為串口發(fā)送數(shù)據(jù)流程。
對(duì)于串口發(fā)送數(shù)據(jù),需要注意的是,打開(kāi)發(fā)送后,數(shù)據(jù)發(fā)送完成,如果不關(guān)閉中斷,程序會(huì)一直進(jìn)入中斷。所以在確保數(shù)據(jù)發(fā)送完成后,需關(guān)閉中斷,退出發(fā)送數(shù)據(jù)。
本文通過(guò)周期性(500ms)的向上位機(jī)發(fā)送一組數(shù)據(jù),來(lái)演示STM8L的串口通信。串口接收部分程序也已經(jīng)調(diào)試好,只需把while循環(huán)中的程序注釋掉,設(shè)置斷點(diǎn),查看上位機(jī)發(fā)送來(lái)的數(shù)據(jù)即可。
下圖為串口助手接收到STM8L每隔500ms發(fā)送過(guò)來(lái)的一組數(shù)據(jù)。

  1. /****************************************************************************************

  2. *開(kāi)發(fā)環(huán)境:IAR for stm8 v1.40.1

  3. *硬件平臺(tái):STM8L-DISCOVERY

  4. *功能說(shuō)明:每隔500ms通過(guò)PC3引腳向上位機(jī)發(fā)送一組數(shù)據(jù)。串口配置為:波特為9600,8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)奇偶校驗(yàn)。

  5. *作    者:茗風(fēng)

  6. ****************************************************************************************/


  7. #include"iostm8l152c6.h"

  8. #include"stdbool.h"

  9. #include"stdint.h"


  10. #define TXBUF_SIZE 9

  11. #define RXBUF_SIZE 25

  12. bool bTX_finished=false;

  13. bool bRX_finished=false;//串口接收完一幀數(shù)據(jù)標(biāo)志位

  14. uint8_t ui8TX_number = 0;

  15. uint8_t ui8RX_counter=0;

  16. uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};

  17. uint8_t ui8RX_buffer[RXBUF_SIZE];

  18. /******************************************************************************************************

  19. *  名    稱:void delay_10ms(uint8_t x_ms)

  20. *  功    能:延時(shí)10ms

  21. *  入口參數(shù):無(wú)

  22. *  出口參數(shù):無(wú)

  23. *  說(shuō)    明:

  24. *  范    例:無(wú)

  25. ******************************************************************************************************/

  26. void delay_100ms(void)

  27. {

  28.   uint8_t i,j;

  29.   for(i=0;i<255;i++)//2*255個(gè)指令周期

  30.     for(j=0;j<255;j++);//2*255個(gè)指令周期

  31.   //delay_10ms共消耗 x_ms*2*255+2*x_ms個(gè)指令周期  

  32.   //255*2*255+2*255=130610us=130ms

  33.   //此延時(shí)函數(shù),延時(shí)時(shí)間為130ms

  34.   //16M/8/2=1M 一個(gè)指令周期為1us

  35. }


  36. /******************************************************************************************************

  37. * 名             稱:void UART_Init(void)

  38. * 功            能:UART定時(shí)器初始化系統(tǒng)

  39. * 入口   參數(shù):無(wú)

  40. * 出口   參數(shù):無(wú)

  41. * 說(shuō)       明:UART初始化為 9600 1 8 n

  42. * 范      例:無(wú)

  43. ******************************************************************************************************/

  44. void UART_Init(void)

  45. {

  46.     /*********************************/

  47.     PC_DDR_DDR2 =0;//輸入

  48.     PC_CR1_C12  =1;//上拉輸入

  49.     PC_CR2_C22 =0;

  50.    

  51.     PC_ODR_ODR3 =1;

  52.     PC_CR1_C13  =1;//推挽輸出

  53.     PC_CR2_C23  =1;//輸出擺率10M   

  54.     PC_DDR_DDR3 =1;//輸出高電平,TX空閑狀態(tài)為高電平,如果不設(shè)置,會(huì)莫名奇妙的發(fā)送0x00

  55.    


  56.     CLK_PCKENR1_PCKEN15=1;//開(kāi)啟USART外設(shè)時(shí)鐘

  57.    

  58.     //開(kāi)啟引腳的UART功能

  59.     //00: USART1_TX on PC3 and USART1_RX on PC2

  60.     //01: USART1_TX on PA2 and USART1_RX on PA3

  61.     //10: USART1_TX on PC5 and USART1_RX on PC6

  62.     SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3

  63.     //如果需要使用其他引腳作為串口發(fā)送接收引腳,請(qǐng)?jiān)谶@里選擇

  64.    

  65.    

  66.     //設(shè)置串口工作方式

  67.     USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit

  68.     USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit

  69.     //設(shè)置波特率

  70.     //波特率設(shè)置為9600

  71.     // 2000000/9600=208    //2000000是此時(shí)系統(tǒng)的主時(shí)鐘頻率,默認(rèn)8分頻,16M/8=2M

  72.     //208(DEC)=00D0(HEX)

  73.     USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1

  74.     USART1_BRR1 =0x0D;


  75. //    USART1_CR2_TEN=0;//使能發(fā)送

  76. //    USART1_CR2_TIEN=0;//打開(kāi)發(fā)送中斷

  77.     USART1_CR2_REN=1;//使能接收

  78.     USART1_CR2_RIEN=1;//打開(kāi)接收中斷

  79. }

  80. void main(void)

  81. {

  82. //  GPIO_Init();

  83.   UART_Init();

  84.   asm("rim");               //enable interrupts

  85.   while(1)

  86.   {

  87.     ui8TX_number=9;

  88.     USART1_CR2_TEN=1;//打開(kāi)發(fā)送

  89.     USART1_CR2_TIEN=1;//打開(kāi)發(fā)送中斷

  90.     delay_100ms();

  91.     delay_100ms();

  92.     delay_100ms();

  93.     delay_100ms();

  94. //    asm("wfi");

  95.   }

  96. }

  97. /*************************************************************************************************** ***

  98. * 名 稱: UART_OnTx()

  99. * 功 能: UART的Tx事件處理函數(shù)

  100. * 入口參數(shù):無(wú)

  101. * 出口參數(shù):無(wú)

  102. * 說(shuō) 明:發(fā)送ui8TX_buffer數(shù)組中的數(shù)據(jù),發(fā)送完成后,置位bTX_finished標(biāo)志位,下一次進(jìn)入中斷后關(guān)閉發(fā)送

  103. * 范 例:無(wú)

  104. ******************************************************************************************************/


  105. #pragma vector=USART_T_TXE_vector

  106. __interrupt void USART_TX_ISR (void)

  107. {

  108.   static uint8_t cnts=0;

  109.   if(bTX_finished && USART1_SR_TC==1)

  110.   {

  111.     bTX_finished=false;

  112.     USART1_CR2_TIEN=0;//關(guān)閉發(fā)送中斷

  113.     USART1_CR2_TEN=0;//關(guān)閉發(fā)送

  114.   }

  115.   else if(USART1_SR_TC==1)

  116.   {

  117.     USART1_DR=ui8TX_buffer[cnts++];

  118.     if(cnts==ui8TX_number)

  119.     {

  120.       cnts=0;

  121.       bTX_finished=true;

  122.     }

  123.   }

  124. }

  125. /******************************************************************************************************

  126. * 名               稱: UART_OnRx()

  127. * 功         能: UART的Tx事件處理函數(shù)

  128. * 入口           參數(shù):無(wú)

  129. * 出口           參數(shù):無(wú)

  130. * 說(shuō)               明:

  131. * 范              例:無(wú)

  132. ******************************************************************************************************/

  133. #pragma vector=USART_R_RXNE_vector

  134. __interrupt void USART_RX_ISR(void)

  135. {

  136.   static uint8_t ui8RX_temp=0;

  137.   if(USART1_SR_RXNE==1)

  138.   {

  139.     ui8RX_temp = USART1_DR;

  140.   }

  141. }

復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:142482 發(fā)表于 2016-10-12 19:43 | 顯示全部樓層
樓樓,119行說(shuō)開(kāi)啟引腳的UART功能是 用I/O口模擬串口的意思嗎
回復(fù)

使用道具 舉報(bào)

ID:735272 發(fā)表于 2020-4-28 15:36 | 顯示全部樓層
為什么我的打開(kāi)串口助手,只能發(fā)送,卻接收不到信息呢?
回復(fù)

使用道具 舉報(bào)

ID:735272 發(fā)表于 2020-4-30 11:29 | 顯示全部樓層
為什我的總是報(bào)錯(cuò)說(shuō)cannot open source file
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表