您的位置 首页 传感器

NEC V850 之 串口通讯(UART4)

搞一个芯片如果不搞串口总是感觉缺点什么,这段时间搞v850系列的32位MCU,基本程序差不多就到串口就截至了,下面就是要弄CAN和系统了。这次…

搞一个芯片假如不搞串口总是感觉缺陷什么,这段时刻搞v850系列的32位MCU,根本程序差不多就到串口就到了,下面便是要弄CAN和体系了。

这次的串口的程序仍是把接纳的字符再发送出去。之前先阐明几点

  1. 体系时钟,设置体系时钟输出脚输出,便利丈量现在的体系时钟,有了精确的时钟才干核算波特率等信息。
  2. 波特率核算方法,依据寄存器UDnCTL1和UDnCTL2来核算,见下图

举个比如:假如串口的总线时钟和体系时钟共同为32MHz,咱们需求115200bps的波特率,下面算出UDnCTL2寄存器的值(即K值),能够得到一个方程为115200bps = 32MHz / 2*k ,能够求的 k = 138.888 ,取值138或许139。可见通讯是有差错的。只要是差错量满足小就不足为虑,不要进行接连的大数据传输问题就不会很大。下面来核算下差错率,假如取值为138的话,则通讯波特率能够由 32MHz / (2*138) = 115942.0289855072 bps ,差错率为((115942.02899/ 115200) – 1)* 100 = 0.644%。


下面是代码部分了

  • 串口接纳中止屏蔽寄存器 UD4RIC
  • 串口操控寄存器0 UD4CTL0
  • 串口操控寄存器1UD4CTL1
  • 串口操控寄存器2 UD4CTL2
  • 时钟挑选操控寄存器3 SELCNT3 — ISEL34
  • 串口状况寄存器 UD4STR — UD4TSF
  • 串口发送数据寄存器 UD4TX
  • 串口接纳数据寄存器UD4RX

程序上操作:串口初始化,串口使能,串口制止,串口查询发送一个字符,串口中止接纳一个字符。

  • 串口初始化
    1. 制止串口发送,承受及运转;
    2. 封闭接纳中止,清接纳中止标志;
    3. 设置中止优先级;
    4. 设置串口波特率
    5. 设置串口时钟;
    6. 设置串口数据帧特点;
    7. 设置串口RXD,TXD端口特点。
  • 串口使能
    1. 使能串口接纳中止,清接纳中止标志位;
    2. 使能串口发送,接纳及运转标志位。
  • 串口制止
    1. 制止串口发送,接纳及运转;
    2. 制止串口的三种中止源。
  • 串口查询发送一个字符
  • 串口中止接纳一个字符

下面是详细的代码了。


代码出处:main.c

#include
#include
#include “system.h”
#include “Uart.h”

void main( void )
{
SystemClkInit(); // 初始化体系时钟为32MHz

/* CLKOUT pin set */
PMCCM |= 0x02; // 设置体系时钟输出引脚使能,输出值为体系时钟(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 */

UD4R%&&&&&% |= 0x07; // 设置承受中止优先级为最低优先级

UD4CTL1 = UARTD_BASECLK_FXP1_1; // 设置串口4的时钟为体系时钟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;
// 设置数据帧格局为 从低位开端,无奇偶效验位,8位数据位,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发送一个字符
* Input : 要发送的字符
* Output : None
* Return : None
*******************************************************************************/
void UART4_SendChar(unsigned char word)
{
if((UD4STR & 0x80) == 0)
{
UD4TX = word;
}
UD4TIF = 0; // 运用的是查询方法发送串口数据,可是相应标识为会置位,这儿为了保存代码完整性
}

/*******************************************************************************
* Function Name : MD_INTUD4R
* Description : 接纳中止服务函数
* 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标志位没有置位,始终是低电平,还有便是查询发送的时分,发送中止使能是封闭的可是以发送结束,对应的UD4TIF标志位就会置位。可是这两点都不影响串口的操作,不知道瑞萨是怎样考虑的,见下图:

假如有知晓答案的朋友,请不吝赐教!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/252146.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部