BF7006学习笔记2 - UART

本文详细介绍了在BF7006BM芯片上使用SCI(UART)进行通信的初始化步骤,包括IO配置、波特率设定、奇偶校验、数据位数和停止位数设置,以及中断驱动的接收和发送功能的启用。此外,还展示了发送和接收数据的具体函数实现,提供了一个完整的SCI接口操作示例。
摘要由CSDN通过智能技术生成

目录

1. 初始化

1.1 IO初始化

​1.2 设置波特率

1.3 设置奇偶校验

1.4 设置数据位数

1.5 设置停止位数

1.6 接收发送使能

1.7 使能SCI

2. 发送数据

3. 接收数据


BF7006BM的UART对应的外设名是SCI,最多2个SCI外设。SCI 模块支持UART和LIN2.0协议通信。

uint32_t const sciGroup[HW_UART_MAX] = {SCI0, SCI1};

1. 初始化

1.1 IO初始化

SCI0对应的IO是PE0(SCI0_TX)和PE1(SCI0_RX),SCI1对应的IO是多组复用:PE2(SCI1_TX)和PE3(SCI1_RX)、PF0(SCI1_TX)和PF1(SCI1_RX)和PE6(SCI1_TX)和PE7(SCI1_RX)。

SCI0只有一组IO,所以不需要初始化IO,而SCI1是三组复用,可以通过SYS_PTSEL寄存器选择对应的IO组。

//0x00: SCI1_PF0_PF1
//0x01: SCI1_PE2_PE3
//0x02: SCI1_PE6_PE7
SYS_PTSEL = 0x01;

注意0x0和0x3都是选择PF0和PF1。

​1.2 设置波特率

寄存器SCI_BDL和SCI_BDH的低5位组合成13位的波特率分频系数。

uint16_t tmp = (uint16_t)((SystemCoreClock / baudrate) >> 4);
SCI_BDH(sciGroup[port]) = (tmp >> 8);
SCI_BDL(sciGroup[port]) = tmp;

SystemCoreClock是系统时钟,默认32MHz。当SCI_BDL和SCI_BDH为0时,不产生波特率,有效取值范围1~8191。对应32MHz的系统频率,波特率范围为244~2M。

1.3 设置奇偶校验

寄存器SCI_C1的位0和位1用于设置奇偶校验。

switch(parity)
{
    case UART_PARITY_NONE:
    default:
        SCI_C1(sciGroup[port]) = 0x00;
        break;
    case UART_PARITY_EVEN:
        SCI_C1(sciGroup[port]) = 0x02;
        break;
    case UART_PARITY_ODD:
        SCI_C1(sciGroup[port]) = 0x03;
        break;
}

1.4 设置数据位数

寄存器SCI_C1的位4用于设置数据位数 

if(datBit == 9)
    SCI_C1(sciGroup[port]) |= (0x01 << 4);

1.5 设置停止位数

寄存器SCI_C1的位6用于设置停止位数 

if(stopBit == UART_STOP_2)
    SCI_C1(sciGroup[port]) |= (0x01 << 6);

1.6 接收发送使能

SCI_C2 寄存器用于设置中断使能和接收发送使能。

SCI_C2(sciGroup[port]) = (1 << 5) | (1 << 3) | (1 << 2);
if(port == HW_UART0)
    NVIC_EnableIRQ(SCI0_RX_IRQn);
else
    NVIC_EnableIRQ(SCI1_RX_IRQn);

1.7 使能SCI

SCI_EN寄存器用于使能SCI。

SCI_EN(sciGroup[port]) = 0x01;

其他设置都采用默认设置。

2. 发送数据

通过SCI_S1寄存器的位7判断发送缓存是否为空。

然后通过SCI_D寄存器发送数据。

void uartSendByte(uint32_t sci, uint8_t dat)
{
    while((SCI_S1(sci) & (1 << 7)) != 0x00U);
    SCI_D(sci) = dat;
}

3. 接收数据

接收数据采用中断的方式,中断程序将得到的数据保存在一个环形缓冲中,由应用程序去获取这些数据,而不在中断程序中实际处理这些数据。

void SCI0_RX_IRQHandler(void)
{
    gUart0RecvBuf[gUartRecvIn[0]++] = SCI_D(SCI0);
    gUartRecvIn[0] %= sizeof(gUart0RecvBuf);
}

void SCI1_RX_IRQHandler(void)
{
    gUart1RecvBuf[gUartRecvIn[1]++] = SCI_D(SCI1);
    gUartRecvIn[1] %= sizeof(gUart1RecvBuf);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深圳驰创芯电子有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值