本文來源電子發燒友社區,作者:王琳, 帖子地址: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瀏覽量
1107 -
CSM32RV20
+關注
關注
0文章
40瀏覽量
349
發布評論請先 登錄
相關推薦
熱點推薦
【Banana Pi BPI-RV2開發板試用體驗】開發環境搭建
參考
https://docs.banana-pi.org/zh/BPI-RV2/BananaPi_BPI-RV2
前言
本文分享開發板基本的ssh登錄,文件傳輸,c開發環境搭建。
上
發表于 06-25 16:07
有獎丨米爾 瑞芯微RK3506開發板免費試用
米爾與瑞芯微合作發布的新品基于瑞芯微RK3506應用處理器的MYD-YR3506開發板免費試用名額來啦~~米爾提供了3塊價值299元的MYD-YR3506

中微愛芯32位MCU開發板AiP32RV15X介紹
AiP32RV15X開發板是一款基于RISCV內核的32位MCU開發板,提供了板載調試器、RESET、WAKEUP按鍵、三色LED、CAN收發器、USB接口、UART、ADC、SPI、

性能強悍!合眾HZ-RK3568開發板試用體驗
月19日 ? 評測數量: 10塊 ? 更多熱點文章閱讀 基于平頭哥TH1520芯片,潤開鴻HH-SCDAYU800A開發板免費試用 RISC-V開發板深度評測!頂級開發板免費

有獎丨米爾 瑞芯微YR3562開發板免費試用
米爾與瑞芯微合作發布的新品基于瑞芯微RK3562應用處理器的MYD-YR3562開發板免費試用活動來啦~~米爾提供了3塊價值599元的MYD-YR3562

串口中斷是內部中斷還是外部中斷,串口中斷是怎么觸發的
串口中斷通常被視為外部中斷。雖然串口控制器(如USART、UART等)可能集成在微控制器或處理器的內部,但從中斷的角度來看,串口中斷是由處理
串口中斷需要清除標志位嗎,串口中斷標志位會自動清除嗎
在電子通信領域,串口中斷作為一種重要的通信機制,廣泛應用于各種嵌入式系統和計算機設備中。串口中斷標志位的管理,尤其是是否需要手動清除以及是否會自動清除,是理解和實現串口通信的關鍵環節。
追加名額丨米爾瑞芯微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

評論