<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > NEC V850 之 串口通信(UART4)

          NEC V850 之 串口通信(UART4)

          作者: 時間:2016-12-03 來源:網絡 收藏
          搞一個芯片如果不搞串口總是感覺缺點什么,這段時間搞v850系列的32位MCU,基本程序差不多就到串口就截至了,下面就是要弄CAN和系統(tǒng)了。

          這次的串口的程序還是把接收的字符再發(fā)送出去。之前先說明幾點

          本文引用地址:http://www.ex-cimer.com/article/201612/325102.htm
          1. 系統(tǒng)時鐘,設置系統(tǒng)時鐘輸出腳輸出,方便測量目前的系統(tǒng)時鐘,有了準確的時鐘才能計算波特率等信息。
          2. 波特率計算方式,根據寄存器UDnCTL1和UDnCTL2來計算,見下圖

          舉個例子:如果串口的總線時鐘和系統(tǒng)時鐘一致為32MHz,我們需要115200bps的波特率,下面算出UDnCTL2寄存器的值(即K值),可以得到一個方程為115200bps = 32MHz / 2*k ,可以求的 k = 138.888 ,取值138或者139??梢娡ㄐ攀怯姓`差的。只要是誤差量足夠小就不足為慮,不要進行連續(xù)的大數(shù)據傳輸問題就不會很大。下面來計算下誤差率,如果取值為138的話,則通信波特率可以由 32MHz / (2*138) = 115942.0289855072 bps ,誤差率為((115942.02899/ 115200) - 1)* 100 = 0.644%。


          下面是代碼部分了

          • 串口接收中斷屏蔽寄存器 UD4RIC
          • 串口控制寄存器0 UD4CTL0
          • 串口控制寄存器1UD4CTL1
          • 串口控制寄存器2 UD4CTL2
          • 時鐘選擇控制寄存器3 SELCNT3 -- ISEL34
          • 串口狀態(tài)寄存器 UD4STR -- UD4TSF
          • 串口發(fā)送數(shù)據寄存器 UD4TX
          • 串口接收數(shù)據寄存器UD4RX

          程序上操作:串口初始化,串口使能,串口禁止,串口查詢發(fā)送一個字符,串口中斷接收一個字符。

          • 串口初始化
            1. 禁止串口發(fā)送,接受及運行;
            2. 關閉接收中斷,清接收中斷標志;
            3. 設置中斷優(yōu)先級;
            4. 設置串口波特率;
            5. 設置串口時鐘;
            6. 設置串口數(shù)據幀屬性;
            7. 設置串口RXD,TXD端口屬性。
          • 串口使能
            1. 使能串口接收中斷,清接收中斷標志位;
            2. 使能串口發(fā)送,接收及運行標志位。
          • 串口禁止
            1. 禁止串口發(fā)送,接收及運行;
            2. 禁止串口的三種中斷源。
          • 串口查詢發(fā)送一個字符
          • 串口中斷接收一個字符

          下面是具體的代碼了。

          代碼出處:main.c

          #include
          #include
          #include "system.h"
          #include "Uart.h"

          void main( void )
          {
          SystemClkInit(); // 初始化系統(tǒng)時鐘為32MHz

          /* CLKOUT pin set */
          PMCCM |= 0x02; // 設置系統(tǒng)時鐘輸出引腳使能,輸出值為系統(tǒng)時鐘(32MHz)

          __DI(); // 關閉總中斷
          UARTD4_Init(); // 初始化串口4
          __EI(); // 打開總中斷

          UARTD4_Start(); // 使能串口4應用
          while (1)
          {;}
          }

          代碼出處:Uart.c

          #include "Uart.h"

          /*******************************************************************************
          * Function Name : UARTD4_Init
          * Description : 串口4初始化
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void UARTD4_Init( void )
          {
          UD4TXE = 0; /* disable transmission operation(uartd4) */
          UD4RXE = 0; /* disable reception operation(uartd4) */
          UD4PWR = 0; /* disable UARTD4 operation */

          UD4RMK = 1; /* INTUD4R interrupt disable */
          UD4RIF = 0; /* clear INTUD4R interrupt flag */

          UD4RIC |= 0x07; // 設置接受中斷優(yōu)先級為最低優(yōu)先級

          UD4CTL1 = UARTD_BASECLK_FXP1_1; // 設置串口4的時鐘為系統(tǒng)時鐘32MHz,不分頻
          UD4CTL2 = 138; // 設置波特率為 115200 bps,計算公式見datasheet 573頁
          ISEL34 = 0; // 設置串口4的時鐘選擇為fXP1,見datasheet 220頁
          UD4CTL0 = UARTD_TRANSFDIR_LSB | UARTD_PARITY_NONE | UARTD_DATALENGTH_8BIT | UARTD_STOPLENGTH_1BIT;
          // 設置數(shù)據幀格式為 從低位開始,無奇偶效驗位,8位數(shù)據位,1位停止位
          /* UARTD4 TXDD4(P915) pin set */ // 設置端口為第二功能模式,配置關系見datasheet 138頁
          PFC9H_bit.no7 = 1;
          PFCE9H_bit.no7 = 1;
          PMC9H_bit.no7 = 1;
          /* UARTD4 RXDD4(P914) pin set */
          PFC9H_bit.no6 = 1;
          PFCE9H_bit.no6 = 1;
          PMC9H_bit.no6 = 1;
          }

          /*******************************************************************************
          * Function Name : UARTD4_Start
          * Description : 串口4使能
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void UARTD4_Start( void )
          {
          UD4RIF = 0; /* clear INTUD4R interrupt flag */
          UD4RMK = 0; /* INTUD4R interrupt enable */

          UD4PWR = 1; /* enable UARTD4 operation */
          UD4TXE = 1; /* enable transmission operation(uartd4) */
          UD4RXE = 1; /* enable reception operation(uartd4) */
          }

          /*******************************************************************************
          * Function Name : UARTD4_Stop
          * Description : 串口4禁止
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          void UARTD4_Stop( void )
          {
          UD4TXE = 0; /* disable transmission operation(uartd4) */
          UD4RXE = 0; /* disable reception operation(uartd4) */
          UD4PWR = 0; /* disable UARTD4 operation */

          // 關閉3個中斷源
          UD4TMK = 1; /* INTUD4T interrupt disable */
          UD4TIF = 0; /* clear INTUD4T interrupt flag */
          UD4RMK = 1; /* INTUD4R interrupt disable */
          UD4RIF = 0; /* clear INTUD4R interrupt flag */
          UD4SMK = 1; /* INTUD4S interrupt disable */
          UD4SIF = 0; /* clear INTUD4S interrupt flag */
          }

          /*******************************************************************************
          * Function Name : UART4_SendChar
          * Description : 串口4發(fā)送一個字符
          * Input : 要發(fā)送的字符
          * Output : None
          * Return : None
          *******************************************************************************/
          void UART4_SendChar(unsigned char word)
          {
          if((UD4STR & 0x80) == 0)
          {
          UD4TX = word;
          }
          UD4TIF = 0; // 使用的是查詢方式發(fā)送串口數(shù)據,但是相應標識為會置位,這里為了保存代碼完整性
          }

          /*******************************************************************************
          * Function Name : MD_INTUD4R
          * Description : 接收中斷服務函數(shù)
          * Input : None
          * Output : None
          * Return : None
          *******************************************************************************/
          #pragma vector = INTUD4R_vector
          __interrupt void MD_INTUD4R(void)
          {
          volatile unsigned char rx_data;

          rx_data = UD4RX;
          UART4_SendChar(rx_data);

          UD4RIF = 0; // 串口接收來中斷并沒有置位寄存器,這里為了保持代碼完整性
          }


          串口是難度并不很大,實驗是可以成功的,但是最后還有2個問題沒有搞清楚,一個是來接收中斷的時候,相應的UD4RIF標志位沒有置位,始終是低電平,還有就是查詢發(fā)送的時候,發(fā)送中斷使能是關閉的但是以發(fā)送完畢,對應的UD4TIF標志位就會置位。但是這兩點都不影響串口的操作,不知道瑞薩是怎么考慮的,見下圖:
          如果有知曉答案的朋友,請不吝賜教!



          關鍵詞: NECV850串口通

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();