在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            NEC V850 之 串口通信(UART4)

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

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

            本文引用地址:http://www.biyoush.com/article/201612/325102.htm
            1. 系統(tǒng)時(shí)鐘,設(shè)置系統(tǒng)時(shí)鐘輸出腳輸出,方便測(cè)量目前的系統(tǒng)時(shí)鐘,有了準(zhǔn)確的時(shí)鐘才能計(jì)算波特率等信息。
            2. 波特率計(jì)算方式,根據(jù)寄存器UDnCTL1和UDnCTL2來(lái)計(jì)算,見(jiàn)下圖

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


            下面是代碼部分了

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

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

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

            下面是具體的代碼了。

            代碼出處:main.c

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

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

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

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

            UARTD4_Start(); // 使能串口4應(yīng)用
            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; // 設(shè)置接受中斷優(yōu)先級(jí)為最低優(yōu)先級(jí)

            UD4CTL1 = UARTD_BASECLK_FXP1_1; // 設(shè)置串口4的時(shí)鐘為系統(tǒng)時(shí)鐘32MHz,不分頻
            UD4CTL2 = 138; // 設(shè)置波特率為 115200 bps,計(jì)算公式見(jiàn)datasheet 573頁(yè)
            ISEL34 = 0; // 設(shè)置串口4的時(shí)鐘選擇為fXP1,見(jiàn)datasheet 220頁(yè)
            UD4CTL0 = UARTD_TRANSFDIR_LSB | UARTD_PARITY_NONE | UARTD_DATALENGTH_8BIT | UARTD_STOPLENGTH_1BIT;
            // 設(shè)置數(shù)據(jù)幀格式為 從低位開(kāi)始,無(wú)奇偶效驗(yàn)位,8位數(shù)據(jù)位,1位停止位
            /* UARTD4 TXDD4(P915) pin set */ // 設(shè)置端口為第二功能模式,配置關(guān)系見(jiàn)datasheet 138頁(yè)
            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 */

            // 關(guān)閉3個(gè)中斷源
            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ā)送一個(gè)字符
            * Input : 要發(fā)送的字符
            * Output : None
            * Return : None
            *******************************************************************************/
            void UART4_SendChar(unsigned char word)
            {
            if((UD4STR & 0x80) == 0)
            {
            UD4TX = word;
            }
            UD4TIF = 0; // 使用的是查詢方式發(fā)送串口數(shù)據(jù),但是相應(yīng)標(biāo)識(shí)為會(huì)置位,這里為了保存代碼完整性
            }

            /*******************************************************************************
            * Function Name : MD_INTUD4R
            * Description : 接收中斷服務(wù)函數(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; // 串口接收來(lái)中斷并沒(méi)有置位寄存器,這里為了保持代碼完整性
            }


            串口是難度并不很大,實(shí)驗(yàn)是可以成功的,但是最后還有2個(gè)問(wèn)題沒(méi)有搞清楚,一個(gè)是來(lái)接收中斷的時(shí)候,相應(yīng)的UD4RIF標(biāo)志位沒(méi)有置位,始終是低電平,還有就是查詢發(fā)送的時(shí)候,發(fā)送中斷使能是關(guān)閉的但是以發(fā)送完畢,對(duì)應(yīng)的UD4TIF標(biāo)志位就會(huì)置位。但是這兩點(diǎn)都不影響串口的操作,不知道瑞薩是怎么考慮的,見(jiàn)下圖:
            如果有知曉答案的朋友,請(qǐng)不吝賜教!



            關(guān)鍵詞: NECV850串口通

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉