目录
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);
}