<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

代碼生成器配置和軟件UART的實現

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2023-05-09 09:25 ? 次閱讀

由于MCU內部資源限制,在應用中會出現UART接口不夠用的情況,如果UART使用的波特率不太高,而且系統中的負荷不是很大的情況就可以使用端口模擬UART的收發,下文是一個在R5F100LE(RL78)上的具體的實現方法,這里略去工程的建立過程,相應的驅動程序細節可以參考代碼生成器生成的代碼,這里只重點講述代碼生成器配置和軟件UART的實現。

一、硬件資源準備

01一個具有外部邊沿中斷功能的IO口來做UART的RXD端口,下面是一個配置的例子,在這里我們使用P137(INTP0),在代碼生成器里選擇INTP0為下降沿中斷,中斷優先級可以任意設置。

dab1c39a-ed7e-11ed-90ce-dac502259ad0.png

02一個普通的輸出口來作為UART的TXD端口。這里選擇P43端口,設置端口輸出高。

dadcf0d8-ed7e-11ed-90ce-dac502259ad0.png

03兩個可以產生中斷、可以隨時關閉啟動、定時間隔可以任意設定的定時器,一個發送定時器用于發送數據,一個接收定時器用于接收數據。

將接收定時器的定時間隔初始化為1位數據的時長的一半,比如波特率2400,1位為416.6us,那么定時器設置為416.6us/2=208.3us,在這里我們使用了Timer的Channel 1

db087d98-ed7e-11ed-90ce-dac502259ad0.pngdb38ade2-ed7e-11ed-90ce-dac502259ad0.png

將發送定時器的定時間隔設置為1位數據時長,比如波特率2400,1位為416.6us,那么定時器設置為416.6us,在這里我們使用Timer的Channel 0。

db4ce2da-ed7e-11ed-90ce-dac502259ad0.png

二、UART接收功能的實現

01接收的軟件實現

接收時我們需要寫兩個中斷函數,在中斷里完成數據的接收,接收完畢后設置一個標志,在主循環中根據標志來判斷數據是否接收完畢。初始化時需要打開邊沿中斷,關閉定時器中斷。

1)邊沿中斷函數處理

當下降沿中斷到來時,在邊沿中斷函數里啟動接收定時器,關閉邊沿中斷。具體程序如下:

左右滑動查看完整內容

void softuart_rece_port_fall_edge_callback(void)
{
 softuart_rece_state = 0;//接收定時器進入次數計數清零
 uart_port_intp_stop();// 關閉邊沿中斷
 start_uart_rece_timer();//打開接收定時器中斷
}

這個函數放到r_cg_intc_user.c內

db6fd894-ed7e-11ed-90ce-dac502259ad0.png

2)接收定時器中斷函數

每奇數次進入中斷時(第1,3,5…)進行RXD端口的采樣并保存數據,同時根據我們的要求進行移位操作(比如LSB或MSB,數據長度是幾位),在偶數次進入中斷時就直接退出,當數據接收完成后設置標志,同時關閉接收定時器中斷,打開邊沿中斷中斷,具體程序如下,這里我是用的8位數據長度和1個停止位:

左右滑動查看完整內容

void softuart_rece_timer_callback(void)
{
static __saddr uint8_t uartrece_shift_reg;
 softuart_rece_state++;//進入次數++
 if(softuart_rece_state==1)//接收start位
 {
  //check start bit
  if(1==get_uart_rece_port())
  {
   //start bit error
   uartrece_shift_reg = 0;
   stop_uart_rece_timer();
   uart_port_intp_start();
  }
 }
 else if (softuart_rece_state<=17)//接收8位數據位
 ?{
 ? ?//receive data sampling point 3,5,7,9,11,13,15,17
 ? ?if(0==(softuart_rece_state&1)) return;
 ? uartrece_shift_reg >>= 1;
  if(1==get_uart_rece_port())
  {
   uartrece_shift_reg |= 0x80;
  }
 }
 else if(softuart_rece_state>=19)//接收停止位
 {
  //stop bit sample sampling point 19
  stop_uart_rece_timer();//關閉接收定時器
  uart_port_intp_start();//打開下降沿中斷
  if(uartrece_end_fg ==0)
  {
   uartrece_data = uartrece_shift_reg;
   uartrece_end_fg =1;//設置接收完畢標志
  }
 }
}

這個程序要放到r_cg_timer_user.c內

db8518f8-ed7e-11ed-90ce-dac502259ad0.png

3)在主循環里調用如下函數來判斷是否收到數據

左右滑動查看完整內容

uint8_t get_softuart_rece(uint8_t * buff)
{
 if(uartrece_end_fg==1)
 {
  uartrece_end_fg =0;
  *buff = uartrece_data;//將數據放入接收緩沖區
  return 1;//說明收到數據
 }
 return 0;
}

三、UART發送功能的實現

01發送軟件的實現

發送時需要寫一個發送定時器中斷函數,在中斷里完成數據發送,發送完成后設置一個標志,在主循環中判斷,初始化時需要關閉發送定時器,中斷的代碼如下:

左右滑動查看完整內容

void softuart_send_callback(void)
{
 softuart_send_state++;
 if(softuart_send_state==10)//發送停止位
 {
  //sampling point 10 stop bit
  softuart_send_port_h();
 }
 else if(softuart_send_state>10)//等待停止位發送完畢
 {
  //>11 stop bit send finished
  softuart_send_state=0;
  stop_uart_send_timer();
 }
 else//發送數據
 {
  //samplimng point 2,3,4,5,6,7,8,9
  if(0!=(uartsend_shift_reg&1))
  {
   softuart_send_port_h();
  }
  else
  {
   softuart_send_port_l();
  }
  uartsend_shift_reg >>= 1;
 }
}

這個程序要放到r_cg_timer_user.c內

dbb12fb0-ed7e-11ed-90ce-dac502259ad0.png

當需要發送時,先將發送端口設置為低電平,然后開啟發送定時器,如果正在發送返回發送錯誤。具體的操作代碼如下:

左右滑動查看完整內容

uint8_t softuart_send(uint8_t data)
{
 if(softuart_send_state!=0)return 0;//數據沒有發送完畢
 softuart_send_state = 1;
 DI();
 softuart_send_port_l();   //發送起始位
 uartsend_shift_reg=data;//將要發送的數據放到移位寄存器
 start_uart_send_timer();//啟動UART發送定時器
 EI();
 return 1;
}

四、整個程序的初始化

由于相應硬件的初始化程序在R_Systeminit已經調用過了,所以我們只用調用啟動程序就行了,為了方便程序的修改,用宏定義重新定義了接口部分。

左右滑動查看完整內容

#define start_uart_rece_timer() R_TAU0_Channel1_Start()
#define stop_uar_rece_timer()  R_TAU0_Channel1_Stop()
#define uart_port_intp_start()    R_INTC0_Start()
#define uart_port_intp_stop()    R_INTC0_Stop()
#define get_uart_rece_port()    P13_bit.no7
#define start_uart_send_timer() R_TAU0_Channel0_Start()
#define stop_uart_send_timer() R_TAU0_Channel0_Stop()
#define softuart_send_port_h()    {P4_bit.no3 = 1;}
#define softuart_send_port_l()    {P4_bit.no3 = 0;}

如果想要修改使用的硬件資源只用修改宏定義即可。

在使用軟件UART之前需要先調用一下如下初始化函數。

左右滑動查看完整內容

void softuart_int(void)
{
 stop_uart_send_timer();//停止發送定時器
 stop_uart_rece_timer();//停止接收定時器
 uart_port_intp_stop(); // 邊沿中斷接收停止
 softuart_send_port_h(); // TXD端口設置為高
 uart_port_intp_start(); // 允許RXD端口的下降沿中斷
 softuart_send_state = 0;
 softuart_rece_state = 0;
 uartrece_end_fg = 0;
}

注意

1)使用上述方法就可以實現一個軟件的UART操作,但是使用過程中不能有長時間的關閉中斷操作,如果有的話會影響程序的執行。

2)如果通訊波特率發生變化需要修改定時器的定時值。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16143

    瀏覽量

    345112
  • 中斷
    +關注

    關注

    5

    文章

    885

    瀏覽量

    41085
  • 定時器
    +關注

    關注

    23

    文章

    3156

    瀏覽量

    112535
  • uart
    +關注

    關注

    22

    文章

    1163

    瀏覽量

    100288
  • 代碼生成器
    +關注

    關注

    0

    文章

    25

    瀏覽量

    9015

原文標題:代碼生成器配置和軟件UART的實現

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    懶人C51代碼生成器

    懶人C51代碼生成器,一款小軟件
    發表于 11-30 00:18

    漢字生成器軟件

    給個漢字生成器軟件!!
    發表于 01-18 11:18

    AllJoyn C++代碼生成器

    AllJoyn 團隊非常激動地向廣大開發商宣布,一款新工具已經問世——代碼生成器。如果您擁有定義的 AllJoyn 服務接口規范,即可通過運行此代碼生成器,為您的服務端和客戶端
    發表于 09-19 18:11

    怎么使用代碼生成器進行外部喚醒源配置

    大家好,我正在使用板, 5.2.1我想配置WKUP [2]引腳號:PA [1]作為外部喚醒源,我沒有找到使用代碼生成器喚醒的任何回調函數代碼生成
    發表于 11-28 10:31

    介紹一下ABOV提供的代碼生成器

    的開發,下面介紹一下ABOV提供的代碼生成器,絲毫不輸CUBEMX,且ABOV單片機基本都支持keil開發環境。。2. ABOV的代碼生成器ABOV
    發表于 11-19 08:06

    python生成器

    python生成器1. 什么是生成器?生成器(英文名 Generator ),是一個可以像迭代器那樣使用for循環來獲取元素的函數。生成器的出現(Python 2.2 +),
    發表于 02-24 15:56

    利用LabVIEW代碼生成器簡化應用項目

    利用LabVIEW代碼生成器簡化應用項目
    發表于 02-26 14:01 ?24次下載
    利用LabVIEW<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>簡化應用項目

    代碼生成器的應用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯的。
    發表于 01-14 15:19 ?0次下載

    數碼管代碼生成器

    數碼管代碼生成器,迅速生成數碼管的相應代碼
    發表于 04-25 10:54 ?40次下載

    STM32庫函數代碼自動生成器V1.2

    stm32庫函數代碼自動生成器是STM32學習的小工具。 stm32庫函數代碼自動生成器可以根據你的配置
    發表于 06-17 17:55 ?0次下載

    STM32庫函數代碼自動生成器正式版

    STM32庫函數代碼自動生成器正式版,感興趣的可以看看。
    發表于 07-13 16:55 ?0次下載

    STM32庫函數代碼自動生成器正式版

    STM32庫函數代碼自動生成器正式版 STM32庫函數代碼自動生成器正式版
    發表于 07-25 18:52 ?0次下載

    python生成器是什么

    python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是一個可以像迭代器那樣使用for循環來獲取元素的函數。 生成器的出現(Python 2.2 +),
    的頭像 發表于 02-24 15:53 ?3198次閱讀

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目
    發表于 01-11 19:00 ?0次下載
    將使用<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項目移植到與智能<b class='flag-5'>配置</b>器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目
    發表于 06-30 20:54 ?0次下載
    將使用<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項目移植到與智能<b class='flag-5'>配置</b>器一起使用的項目
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>