本文來源電子發燒友社區,作者:王琳, 帖子地址:https://bbs.elecfans.com/jishu_2251612_1_1.html
收到開發板之后,發現下載工具集成了串口調試助手,這個還是挺不錯了。demo程序是查詢方式實現串口打印。對于調試是沒有問題的。但是如果串口用于MODBUS或者其他的一些應用,基本都是中斷方式。
收到開發板之后,發現下載工具集成了串口調試助手,這個還是挺不錯了。demo程序是查詢方式實現串口打印。對于調試是沒有問題的。但是如果串口用于MODBUS或者其他的一些應用,基本都是中斷方式。
首先用中斷方式的DEMO程序,似乎無法調通,于是用自己的方式調試串口。首先看看datasheet。居然只有四個寄存器,非常容易上手。
1.用下載工具提供的串口助手發送給MCU,MCU再把數據打印出來。
///----System Init --------------------------------------------------------------------------
CLIC_Init();//系統中斷配置
System_clock_Init();//系統時鐘初始化
SYS_Interrupt_Enable();//CLIC開總中斷
此部分仍采用demo程序。
//初始化串口
UART_Init_IT_case1(UART2);//中斷模式
做一些簡單修改,使能接收
UARTx->CTRL = 0<<25? ?? ???//發送中斷使能: 0-off,1-on
|1<<24? ?? ???//接收中斷使能:0-off,1-on
|0x0116<<8? ? //波特率(對應16M時鐘):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6? ?? ?? ?//模式選擇:0-模式0,1-模式1,2/3-模式2
|0<<5? ?? ?? ?//多處理器使能
|1<<4? ?? ?? ?//接收使能
|0<<3? ?? ?? ?//發送數據bit8
|0<<2;? ?? ???//接收數據bit8
//寫幾行代碼,處理發送和接收
發送數據:
void INE_vWriteData(uint8_t u8TxData)
{
uint32_t u32TempValue = 0;
u32TempValue = (1<< 25);
UART2->DATA = u8TxData;
UART2->CTRL = UART2->CTRL|u32TempValue;
}
先把數據放進寄存器,再使能發送
接收數據:
void UART1_IRQhandler(void)
{
uint32_t u32TempValue = 0;
uint32_t u32TempValue2 = 0;
uint8_t i = 0;
if(UART1->CTRL&0x1)//接收中斷標志
{
//IRQ Hander......
INE_u8RecBuf[i++] = UART1->DATA;
//INE_u8RecBuf[0] = 2;
INE_u8Length = i;
//u32TempValue2 = (1<< 24);
///u32TempValue2 = ~u32TempValue;
//UART1->CTRL = UART1->CTRL&u32TempValue;
UART1->CTRL = (UART1->CTRL|0x01);//清除接收中斷
}
if(UART1->CTRL&0x2)//發送中斷標志
{
UART1->CTRL = (UART1->CTRL&0xfffffffe)|0x2;//清除發送中斷
//IRQ Hander......
u32TempValue = (1<< 25);
u32TempValue = ~u32TempValue;
UART1->CTRL = UART1->CTRL&u32TempValue;
}
}
接收數據放在中斷函數內部,同時清中斷標志位。
對于發送來說,發送結束,同樣清發送完成中斷標志,并關閉發送使能位。
main函數打印數據
for (uint8_t i=0; i< INE_u8Length; i ++)
{
INE_vWriteData(INE_u8RecBuf); } INE_u8Length = 0;由于只想DEMO一下收發功能,所以支持收發一個字節。
CLIC_Init();//系統中斷配置
System_clock_Init();//系統時鐘初始化
SYS_Interrupt_Enable();//CLIC開總中斷
此部分仍采用demo程序。
//初始化串口
UART_Init_IT_case1(UART2);//中斷模式
做一些簡單修改,使能接收
UARTx->CTRL = 0<<25? ?? ???//發送中斷使能: 0-off,1-on
|1<<24? ?? ???//接收中斷使能:0-off,1-on
|0x0116<<8? ? //波特率(對應16M時鐘):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6? ?? ?? ?//模式選擇:0-模式0,1-模式1,2/3-模式2
|0<<5? ?? ?? ?//多處理器使能
|1<<4? ?? ?? ?//接收使能
|0<<3? ?? ?? ?//發送數據bit8
|0<<2;? ?? ???//接收數據bit8
//寫幾行代碼,處理發送和接收
發送數據:
void INE_vWriteData(uint8_t u8TxData)
{
uint32_t u32TempValue = 0;
u32TempValue = (1<< 25);
UART2->DATA = u8TxData;
UART2->CTRL = UART2->CTRL|u32TempValue;
}
先把數據放進寄存器,再使能發送
接收數據:
void UART1_IRQhandler(void)
{
uint32_t u32TempValue = 0;
uint32_t u32TempValue2 = 0;
uint8_t i = 0;
if(UART1->CTRL&0x1)//接收中斷標志
{
//IRQ Hander......
INE_u8RecBuf[i++] = UART1->DATA;
//INE_u8RecBuf[0] = 2;
INE_u8Length = i;
//u32TempValue2 = (1<< 24);
///u32TempValue2 = ~u32TempValue;
//UART1->CTRL = UART1->CTRL&u32TempValue;
UART1->CTRL = (UART1->CTRL|0x01);//清除接收中斷
}
if(UART1->CTRL&0x2)//發送中斷標志
{
UART1->CTRL = (UART1->CTRL&0xfffffffe)|0x2;//清除發送中斷
//IRQ Hander......
u32TempValue = (1<< 25);
u32TempValue = ~u32TempValue;
UART1->CTRL = UART1->CTRL&u32TempValue;
}
}
接收數據放在中斷函數內部,同時清中斷標志位。
對于發送來說,發送結束,同樣清發送完成中斷標志,并關閉發送使能位。
main函數打印數據
for (uint8_t i=0; i< INE_u8Length; i ++)
{
INE_vWriteData(INE_u8RecBuf); } INE_u8Length = 0;由于只想DEMO一下收發功能,所以支持收發一個字節。
2.切換到串口2,修改代碼并用串口調試助手發送數據,打印數據。
總結:
1.串口寄存器簡單易用,非常適合簡單的應用場合。
2.同時datasheet過于簡單,甚至找不到串口內部的邏輯圖。
3.也正是由于過于簡單,恐怕難以實現一些特殊的靈活應用。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
南京中科微
+關注
關注
0文章
60瀏覽量
744 -
CSM32RV20
+關注
關注
0文章
40瀏覽量
216
發布評論請先 登錄
相關推薦
有獎丨米爾 全志T536開發板免費試用
米爾與全志合作發布的新品基于全志T536應用處理器的MYD-LT536-GK開發板免費試用活動來啦~~米爾提供了3塊價值750元的MYD-LT536-GK開發板發起試用活動您不僅可以免
瑞芯微平臺Android系統串口測試方法,觸覺智能RK3562開發板演示
瑞芯微方案主板Android系統串口測試方法,通用RK3568、RK3566、RK3588、RK3576等。觸覺智能RK3562開發板演示
瑞芯微主板/開發板Linux系統播放音頻方法,觸覺智能RK3562開發板演示
本文介紹瑞芯微方案主板/開發板Linux系統播放音頻的方法,觸覺智能RK3562開發板演示,通用RK3566、RK3568、RK3588等
追加名額丨米爾瑞芯微RK3576開發板有獎試用
米爾與瑞芯微合作發布的新品基于瑞芯微RK3576應用處理器的MYD-LR3576開發板免費試用活動加碼啦~~米爾追加了2塊價值849元的MYD-LR3576
常用在工業控制系統上的MCU芯片資料:CSM32RV20
CSM32RV20是一款基于RISC-V核的低功耗MCU芯片。 內置RISC-V RV32IMAC內核(2.6CoreMark/MHz); 蕞高32MHz工作頻率; 內置4kB的SRAM; 內置8B
有獎丨米爾 瑞芯微RK3576開發板免費試用
米爾與瑞芯微合作發布的新品基于瑞芯微RK3576應用處理器的MYD-LR3576開發板免費試用活動來啦~~米爾提供了7塊價值849元的MYD-LR3576
點擊參與米爾NXP i.MX 93開發板有獎試用
米爾與NXP合作發布的新品基于NXPi.MX93應用處理器的MYD-LMX9X開發板免費試用活動來啦~~米爾提供了3塊價值678元的MYD-LMX9X開發板發起試用活動您不僅可以免費體
用stm32cubemx的串口中斷接收時,過一段時間串口中斷不進了怎么解決?
個小時多串口中斷進不去了,我用兩根線掛在總線上在電腦上用串口助手監聽收發的數據,發送和應答的過程還在持續,其他功能也都正常只是cubemx的程序認為沒有收到數據。很難定位是哪里的問題。
發表于 04-17 06:48
香橙派發布首款RISC-V開發板OrangePi RV
2024年3月,香橙派在全球開發者會議上發布了其首款基于RISC-V開發的OrangePi RV主板。這款開發板擁有四核RISC-V U74與S7協處理器,配備 2MB L2緩存。同時
評論