|
先總結(jié)一些調(diào)試串口遇到的問(wèn)題
1、串口調(diào)試接收開始多了一個(gè)0x00,或結(jié)尾多了一個(gè)0x00,前者我遇到的是串口寄存器(USART1_CR2)配置問(wèn)題,后者是串口發(fā)送中斷的計(jì)數(shù)值問(wèn)題。USART1_DR = ui8TX_buffer[cnts++]; if(cnts>=ui8TX_number)
2、還有波特率的計(jì)算。
USART1_BRR2 [ 15:12 3:0 ]
USART1_BRR1 [ 11 : 4 ]
主時(shí)鐘頻率/分頻系數(shù)/波特率=裝載值
16000000Hz/1/9600=1666.66=1667轉(zhuǎn)換為十六進(jìn)制0x683
USART1_BRR2 =0x03;
USART1_BRR1 =0x68;
串口調(diào)試
接收的數(shù)據(jù)
單片機(jī)源程序如下:
- /* MAIN.C file
- *
- * Copyright (c) 2002-2005 STMicroelectronics
- */
-
- #include "STM8L152R.h"
- #include "led.h"
- #include "MATH.h"
- /*
- PC2 USART1_RX ---->>> CH340 TX
- PC3 USART1_TX ---->>> CH340 RX
- */
- #define TXBUF_SIZE 16
- #define RXBUF_SIZE 16
- _Bool bTX_finished=0;
- _Bool bRX_finished=0;//串口接收完一幀數(shù)據(jù)標(biāo)志位
- unsigned int ui8TX_number = 16;
- unsigned int ui8RX_counter=16;
- //66 64 00 03 04 05 06 07 08 09 0A 0B 0C 0D 64 66
- /*
- 0x66 0x64 0x00 0x64 0x66
- 發(fā)送 |數(shù)據(jù)包頭| 指令| AD 電壓 | 氣壓 |排氣調(diào)整值|進(jìn)氣調(diào)整值| 3byte 空 |數(shù)據(jù)包尾| //發(fā)送信息 指令0x00
- 接收 |數(shù)據(jù)包頭| 指令|目標(biāo)氣壓 |進(jìn)氣P|I | D | 排氣P| I | D | 3byte 空 |數(shù)據(jù)包尾| //接收信息 指令0x01 修改目標(biāo)氣壓
- 接收 |數(shù)據(jù)包頭| 指令|目標(biāo)氣壓 |進(jìn)氣P|I | D | 排氣P| I | D | 3byte 空 |數(shù)據(jù)包尾| //接收信息 指令0x02 修改PID參數(shù)
- */
- /***************************************|數(shù)據(jù)包頭| 指令| AD 電壓 | 氣壓 |排氣調(diào)整值|進(jìn)氣調(diào)整值| 3byte 空 |數(shù)據(jù)包尾|*/
- unsigned char ui8TX_buffer[TXBUF_SIZE]={0x66,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x66};
- unsigned char ui8RX_buffer[RXBUF_SIZE];
- char RX_OK=0;
- extern unsigned char LED_RAM[3];
- #define USART1_SR_TC USART1_SR|(~0x40)//USART1_SR_TC 為0發(fā)送未完成 為1發(fā)送完成
- #define USART1_SR_RXNE USART1_SR|(~0x20)//USART1_SR_RXNE 為1表示接收到了數(shù)據(jù) 為0沒收到數(shù)據(jù)
- void delay_100ms(unsigned int x_ms)
- {
- unsigned int i,j;
- for(i=x_ms;i>0;i--)//2*255個(gè)指令周期
- for(j=0;j<110;j++);//2*255個(gè)指令周期
- //delay_10ms共消耗 x_ms*2*255+2*x_ms個(gè)指令周期
- //255*2*255+2*255=130610us=130ms
- //此延時(shí)函數(shù),延時(shí)時(shí)間為130ms
- //16M/8/2=1M 一個(gè)指令周期為1us
- }
- void MENU_print_Px(int P)
- {
- if(P>999)
- {
- LED_TOP_putc(2,((P)%10)+'0',0);
- P/=10;
- LED_TOP_putc(1,((P)%10)+'0',0);
- P/=10;
- LED_TOP_putc(0,((P)%10)+'A',0);
- }
- else
- {LED_TOP_putc(2,((P)%10)+'0',0);
- P/=10;
- LED_TOP_putc(1,((P)%10)+'0',0);
- P/=10;
- LED_TOP_putc(0,((P)%10)+'0',0);
- }
- }
- void UART_Init(void)
- {
- /*********************************/
- PC_DDR = 0<<2;//輸入
- PC_CR1 = 1<<2;//上拉輸入
-
- PC_ODR = 1<<3;
- PC_CR1 = 1<<3;//推挽輸出
- PC_CR2 = 1<<3;//輸出擺率10M
- PC_DDR = 1<<3;//輸出高電平,TX空閑狀態(tài)為高電平,如果不設(shè)置,會(huì)莫名奇妙的發(fā)送0x00
- CLK_PCKENR1=1<<5;//開啟USART1外設(shè)時(shí)鐘
- //開啟引腳的UART功能
- //00: USART1_TX on PC3 and USART1_RX on PC2
- //01: USART1_TX on PA2 and USART1_RX on PA3
- //10: USART1_TX on PC5 and USART1_RX on PC6
- // SYSCFG_RMPCR1 &= (~0x30);//PC2,PC3 //默認(rèn)
- //如果需要使用其他引腳作為串口發(fā)送接收引腳,請(qǐng)?jiān)谶@里選擇
-
- //設(shè)置串口工作方式
- USART1_CR1 &= 0x00;//~0X3E;//1 start bit,8 data bit,n stop bit
-
- USART1_CR3 &= 0x00;//1 stop bit
- //設(shè)置波特率
- //波特率設(shè)置為9600
- // 2000000/9600=208 //2000000是此時(shí)系統(tǒng)的主時(shí)鐘頻率,默認(rèn)8分頻,16M/8=2M
- //208(DEC)=00D0(HEX)
- USART1_BRR2 =0x03;//the BRR2 should be programmed before BRR1
- USART1_BRR1 =0x68;//9600 683
- // USART1_CR2 = 1<<3;//使能發(fā)送
- // USART1_CR2 = 1<<7;//打開發(fā)送中斷
- // USART1_CR2 = 1<<2;//使能接收
- USART1_CR2=0x24;//打開接收
- // USART1_CR2 = 1<<5;//打開接收中斷
- }
- /*
- 發(fā)送輸入采集電壓數(shù)據(jù)到串口 2byte
- 低位在前,高位在后
- */
- void recover_command(void)
- {
- //指令為0 只設(shè)置氣壓參數(shù)
- //指令為1 只設(shè)定PID參數(shù)
- //發(fā)送返回為 0 告訴當(dāng)前是通訊控制
- //發(fā)送返回為 1 告訴當(dāng)前是輸入控制
- char SET_Pressure_Pid=0;
-
- SET_Pressure_Pid = ui8TX_buffer[2];
-
- }
- void send_ADC_data(int IN_voltage)
- {
- ui8TX_buffer[3]= IN_voltage ;
- ui8TX_buffer[4]= IN_voltage>>8;
- }
- void send_DAC_data(int IN_pressure)
- {
- ui8TX_buffer[5]= IN_pressure ;
- ui8TX_buffer[6]= IN_pressure>>8;
- }
- void main(void)
- {
-
- int count=0;
- int num_test=0;
- int DIR=0;
- char RX_OK_flag=0;
- int AD_TEST=4096;
- char AD_TEST_DIR=0;
-
- _asm("sim"); /* Disable interrupts */
- CLK_CKDIVR=0x00;//內(nèi)部16MHz 不分頻
- UART_Init();
- LED_init();
- _asm("rim");
- while(1)
- {
- count++;
- if(count % 100 == 0)
- {
- if(AD_TEST_DIR == 0)
- {
- AD_TEST+=100;
- if(AD_TEST>16383)
- {
- AD_TEST_DIR=1;
- }
- }
- else
- {
- AD_TEST-=100;
- if(AD_TEST<0)
- {
- AD_TEST_DIR=0;
- }
- }
- send_DAC_data(AD_TEST);
- USART1_CR2 |=0x88;//打開發(fā)送
- delay_100ms(200);
- }
- if(count % 10 == 0)
- {
- if(bRX_finished == 1)//接收完成
- {
- if(ui8RX_buffer[2] == 0x00)//分析接收的命令 修改執(zhí)行變量
- RX_OK_flag = 1;
- else
- RX_OK_flag = 0;
- bRX_finished = 0; //清除接收完成標(biāo)志,準(zhǔn)備下一次接收
- }
- if(RX_OK_flag == 1)//響應(yīng)接收到的指令,并執(zhí)行相應(yīng)操作
- {
- send_ADC_data(num_test);
- USART1_CR2 |=0x88;//打開發(fā)送 返回想要的結(jié)果
- RX_OK_flag = 0;//執(zhí)行操作完成,修改回變量值
- if(DIR == 0)
- {
- num_test+=1;
- if(num_test>=8192)//10922
- DIR=1;
- }
- else
- {
- num_test-=1;
- if(num_test<=4096)//5461
- DIR=0;
- }
- }
- }
- delay_100ms(1);
- if(count>=10000)
- count=0;
- }
- }
-
- /*************************************************************************************************** ***
- * 名 稱: USART_TX_ISR()
- * 功 能: UART的Tx事件處理函數(shù)
- * 入口參數(shù):無(wú)
- * 出口參數(shù):無(wú)
- * 說(shuō) 明:發(fā)送ui8TX_buffer數(shù)組中的數(shù)據(jù),發(fā)送完成后,置位bTX_finished標(biāo)志位,下一次進(jìn)入中斷后關(guān)閉發(fā)送
- * 范 例:無(wú)
- ******************************************************************************************************/
- @far @interrupt void USART_TX_ISR (void)
- {
- static unsigned int cnts=0;
-
- if(USART1_SR_TC != 1)//不等于1 表示發(fā)送未完成
- {
- USART1_DR = ui8TX_buffer[cnts++];
- if(cnts>=ui8TX_number)
- {
- cnts=0;
- bTX_finished=1;
- USART1_CR2 &= ~0x80;//關(guān)閉發(fā)送中斷
- }
- }
- else cnts=0;
- }
- /******************************************************************************************************
- * 名 稱: USART_RX_ISR()
- * 功 能: UART的Tx事件處理函數(shù)
- * 入口 參數(shù):無(wú)
- * 出口 參數(shù):無(wú)
- * 說(shuō) 明:
- * 范 例:無(wú)
- ******************************************************************************************************/
- @far @interrupt void USART_RX_ISR (void)
- {
- static unsigned int ui8RX_temp=0;
-
- if(USART1_SR_RXNE)
- {
- ui8RX_buffer[ui8RX_temp++] = USART1_DR;
- if(ui8RX_temp>=ui8RX_counter)
- {
- ui8RX_temp=0;//接收到正確包頭和包尾 共4byte
- if(ui8RX_buffer[0] == 0x66 && ui8RX_buffer[1] == 0x64 && ui8RX_buffer[14] == 0x64 && ui8RX_buffer[15] == 0x66)
- bRX_finished=1;
- else
- bRX_finished=0;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
UART.rar
(92.02 KB, 下載次數(shù): 41)
2018-5-24 11:45 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|