久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5835|回復: 0
打印 上一主題 下一主題
收起左側

stm8L152R8T6串口UART調試,波特率計算與程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
先總結一些調試串口遇到的問題
1、串口調試接收開始多了一個0x00,或結尾多了一個0x00,前者我遇到的是串口寄存器(USART1_CR2)配置問題,后者是串口發送中斷的計數值問題。USART1_DR =  ui8TX_buffer[cnts++];    if(cnts>=ui8TX_number)

2、還有波特率的計算。
USART1_BRR2 [ 15:12    3:0 ]
USART1_BRR1 [ 11 : 4 ]
主時鐘頻率/分頻系數/波特率=裝載值
16000000Hz/1/9600=1666.66=1667轉換為十六進制0x683
  USART1_BRR2 =0x03;
  USART1_BRR1 =0x68;


單片機源程序如下:
  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */

  5. #include "STM8L152R.h"
  6. #include "led.h"
  7. #include "MATH.h"
  8. /*
  9. PC2 USART1_RX ---->>> CH340 TX
  10. PC3 USART1_TX ---->>> CH340 RX
  11. */

  12. #define TXBUF_SIZE 16
  13. #define RXBUF_SIZE 16

  14. _Bool bTX_finished=0;
  15. _Bool bRX_finished=0;//串口接收完一幀數據標志位

  16. unsigned int ui8TX_number = 16;

  17. unsigned int ui8RX_counter=16;
  18. //66 64 00 03 04 05 06 07 08 09 0A 0B 0C 0D 64 66
  19. /*
  20.                          0x66 0x64 0x00                                                      0x64 0x66
  21. 發送  |數據包頭| 指令| AD 電壓 | 氣壓   |排氣調整值|進氣調整值|   3byte 空 |數據包尾| //發送信息 指令0x00
  22. 接收  |數據包頭| 指令|目標氣壓 |進氣P|I | D | 排氣P|  I | D   |   3byte 空 |數據包尾| //接收信息 指令0x01 修改目標氣壓
  23. 接收  |數據包頭| 指令|目標氣壓 |進氣P|I | D | 排氣P|  I | D   |   3byte 空 |數據包尾| //接收信息 指令0x02 修改PID參數
  24. */
  25. /***************************************|數據包頭| 指令| AD 電壓 | 氣壓   |排氣調整值|進氣調整值|   3byte 空 |數據包尾|*/
  26. unsigned char ui8TX_buffer[TXBUF_SIZE]={0x66,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x66};
  27. unsigned char ui8RX_buffer[RXBUF_SIZE];

  28. char RX_OK=0;
  29. extern unsigned char LED_RAM[3];

  30. #define USART1_SR_TC    USART1_SR|(~0x40)//USART1_SR_TC 為0發送未完成   為1發送完成         
  31. #define USART1_SR_RXNE  USART1_SR|(~0x20)//USART1_SR_RXNE 為1表示接收到了數據  為0沒收到數據
  32. void delay_100ms(unsigned int x_ms)
  33. {

  34.   unsigned int i,j;

  35.   for(i=x_ms;i>0;i--)//2*255個指令周期

  36.     for(j=0;j<110;j++);//2*255個指令周期

  37.   //delay_10ms共消耗 x_ms*2*255+2*x_ms個指令周期  

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

  39.   //此延時函數,延時時間為130ms

  40.   //16M/8/2=1M 一個指令周期為1us

  41. }

  42. void MENU_print_Px(int P)
  43. {
  44.          if(P>999)
  45.      {
  46.                         LED_TOP_putc(2,((P)%10)+'0',0);
  47.                   P/=10;
  48.                   LED_TOP_putc(1,((P)%10)+'0',0);
  49.       P/=10;
  50.                   LED_TOP_putc(0,((P)%10)+'A',0);
  51.      }
  52.    else                 
  53.                  {LED_TOP_putc(2,((P)%10)+'0',0);
  54.                   P/=10;
  55.                   LED_TOP_putc(1,((P)%10)+'0',0);
  56.       P/=10;
  57.                   LED_TOP_putc(0,((P)%10)+'0',0);
  58.                  }       
  59. }
  60. void UART_Init(void)
  61. {
  62.     /*********************************/

  63.     PC_DDR = 0<<2;//輸入

  64.     PC_CR1 = 1<<2;//上拉輸入

  65.    
  66.     PC_ODR = 1<<3;

  67.     PC_CR1 = 1<<3;//推挽輸出

  68.     PC_CR2 = 1<<3;//輸出擺率10M   

  69.     PC_DDR = 1<<3;//輸出高電平,TX空閑狀態為高電平,如果不設置,會莫名奇妙的發送0x00


  70.     CLK_PCKENR1=1<<5;//開啟USART1外設時鐘


  71.     //開啟引腳的UART功能

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

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

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

  75. //   SYSCFG_RMPCR1 &= (~0x30);//PC2,PC3 //默認

  76.     //如果需要使用其他引腳作為串口發送接收引腳,請在這里選擇

  77.    

  78.     //設置串口工作方式

  79.     USART1_CR1 &= 0x00;//~0X3E;//1 start bit,8 data bit,n stop bit

  80.     USART1_CR3 &= 0x00;//1 stop bit

  81.     //設置波特率

  82.     //波特率設置為9600

  83.     // 2000000/9600=208    //2000000是此時系統的主時鐘頻率,默認8分頻,16M/8=2M

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

  85.     USART1_BRR2 =0x03;//the BRR2 should be programmed before BRR1

  86.     USART1_BRR1 =0x68;//9600 683


  87.   //  USART1_CR2 = 1<<3;//使能發送

  88.    // USART1_CR2 = 1<<7;//打開發送中斷

  89.          // USART1_CR2 = 1<<2;//使能接收
  90.       USART1_CR2=0x24;//打開接收
  91.    // USART1_CR2 = 1<<5;//打開接收中斷

  92. }
  93. /*
  94. 發送輸入采集電壓數據到串口 2byte
  95. 低位在前,高位在后
  96. */
  97. void recover_command(void)
  98. {
  99.         //指令為0  只設置氣壓參數
  100.         //指令為1  只設定PID參數
  101.         //發送返回為  0 告訴當前是通訊控制
  102.         //發送返回為  1 告訴當前是輸入控制
  103.         char SET_Pressure_Pid=0;
  104.        
  105.         SET_Pressure_Pid = ui8TX_buffer[2];  
  106.        
  107. }
  108. void send_ADC_data(int IN_voltage)
  109. {
  110.         ui8TX_buffer[3]=        IN_voltage   ;
  111.         ui8TX_buffer[4]=        IN_voltage>>8;
  112. }
  113. void send_DAC_data(int IN_pressure)
  114. {
  115.         ui8TX_buffer[5]=        IN_pressure   ;
  116.         ui8TX_buffer[6]=        IN_pressure>>8;
  117. }
  118. void main(void)
  119. {

  120.         int  count=0;
  121.         int  num_test=0;
  122.         int  DIR=0;
  123.         char RX_OK_flag=0;
  124.         int  AD_TEST=4096;
  125.         char AD_TEST_DIR=0;

  126.         _asm("sim");  /* Disable interrupts */
  127.         CLK_CKDIVR=0x00;//內部16MHz  不分頻
  128.         UART_Init();
  129.         LED_init();
  130.         _asm("rim");
  131.         while(1)
  132.   {
  133.                 count++;
  134.                  if(count % 100 == 0)
  135.                 {
  136.                         if(AD_TEST_DIR == 0)
  137.                         {  
  138.                                 AD_TEST+=100;
  139.                                 if(AD_TEST>16383)
  140.                                 {
  141.                                         AD_TEST_DIR=1;
  142.                                 }
  143.                         }
  144.                         else
  145.                         {
  146.                                 AD_TEST-=100;
  147.                                 if(AD_TEST<0)
  148.                                 {
  149.                                         AD_TEST_DIR=0;
  150.                                 }
  151.                         }
  152.                   send_DAC_data(AD_TEST);  
  153.                   USART1_CR2 |=0x88;//打開發送  
  154.            delay_100ms(200);  
  155.                 }
  156.                 if(count % 10 == 0)
  157.                             {
  158.                                                 if(bRX_finished == 1)//接收完成
  159.                                                 {
  160.                                                  if(ui8RX_buffer[2] == 0x00)//分析接收的命令  修改執行變量
  161.                                                         RX_OK_flag = 1;
  162.                                                         else
  163.                                                         RX_OK_flag = 0;
  164.                                                          bRX_finished = 0; //清除接收完成標志,準備下一次接收
  165.                                                 }
  166.                                          if(RX_OK_flag == 1)//響應接收到的指令,并執行相應操作
  167.                                          {  
  168.                                                         send_ADC_data(num_test);  
  169.                                                         USART1_CR2 |=0x88;//打開發送  返回想要的結果
  170.                                                         RX_OK_flag = 0;//執行操作完成,修改回變量值
  171.                                                           if(DIR == 0)
  172.                                                                  {
  173.                                                                                  num_test+=1;
  174.                                                                                  if(num_test>=8192)//10922
  175.                                                                                  DIR=1;
  176.                                                                  }
  177.                                                                  else
  178.                                                                  {
  179.                                                                                 num_test-=1;
  180.                                                                                 if(num_test<=4096)//5461
  181.                                                                                 DIR=0;
  182.                                                                  }
  183.                                                 }
  184.                                         }
  185.                 delay_100ms(1);
  186.                 if(count>=10000)
  187.                                         count=0;                 
  188.   }
  189. }



  190. /*************************************************************************************************** ***

  191. * 名 稱: USART_TX_ISR()

  192. * 功 能: UART的Tx事件處理函數

  193. * 入口參數:無

  194. * 出口參數:無

  195. * 說 明:發送ui8TX_buffer數組中的數據,發送完成后,置位bTX_finished標志位,下一次進入中斷后關閉發送

  196. * 范 例:無

  197. ******************************************************************************************************/

  198. @far @interrupt void USART_TX_ISR (void)
  199. {
  200.   static unsigned int cnts=0;

  201.         if(USART1_SR_TC != 1)//不等于1 表示發送未完成
  202.   {
  203.                 USART1_DR =  ui8TX_buffer[cnts++];
  204.     if(cnts>=ui8TX_number)
  205.     {
  206.       cnts=0;
  207.       bTX_finished=1;
  208.                         USART1_CR2 &= ~0x80;//關閉發送中斷  
  209.     }  
  210.   }
  211.         else cnts=0;
  212. }

  213. /******************************************************************************************************

  214. * 名               稱: USART_RX_ISR()

  215. * 功               能: UART的Tx事件處理函數

  216. * 入口             參數:無

  217. * 出口             參數:無

  218. * 說               明:

  219. * 范               例:無

  220. ******************************************************************************************************/

  221. @far @interrupt void USART_RX_ISR (void)
  222. {
  223.   static unsigned int ui8RX_temp=0;
  224.        
  225.   if(USART1_SR_RXNE)
  226.   {
  227.     ui8RX_buffer[ui8RX_temp++] = USART1_DR;
  228.                 if(ui8RX_temp>=ui8RX_counter)
  229.     {
  230.       ui8RX_temp=0;//接收到正確包頭和包尾 共4byte
  231.                         if(ui8RX_buffer[0] == 0x66 && ui8RX_buffer[1] == 0x64 && ui8RX_buffer[14] == 0x64 && ui8RX_buffer[15] == 0x66)
  232.       bRX_finished=1;
  233.                         else
  234.                   bRX_finished=0;  
  235.     }
  236.   }
  237. }
復制代碼

所有資料51hei提供下載:
UART.rar (92.02 KB, 下載次數: 41)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久午夜 | 精品亚洲一区二区 | 成人国产精品久久 | 国产精品资源在线 | 午夜在线免费观看 | av中文字幕在线观看 | 神马久久久久久久久久 | 亚洲精品久久久久久久久久吃药 | av免费网址 | 精品国产一二三区 | 欧美日韩中 | 麻豆av免费观看 | 国产一区二区三区四区区 | 日韩福利| 欧美日本在线观看 | 亚洲国产精品久久久久秋霞不卡 | 国产精品久久 | 久久国产精品-久久精品 | 成人福利视频 | 亚洲国产福利视频 | 超碰欧美 | 亚洲精品一区在线 | 在线视频一区二区三区 | 国产精品s色 | 久久久久亚洲 | 91视频入口 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 免费黄色特级片 | 免费在线观看一区二区 | 一区二区三区视频在线观看 | 亚洲国产一区视频 | 日韩久草 | 亚洲欧洲精品一区 | 色综合久 | 奇米影视在线 | 精品乱人伦一区二区三区 | 日本成人一区二区 | 黑人巨大精品欧美一区二区一视频 | 伦理午夜电影免费观看 | 丝袜久久 | 免费看黄色视屏 |