本帖最后由 manhuami2007 于 2023-10-30 18:01 编辑
串口是一个经常使用的接口,能够与其它芯片通信,也能输出运行信息。这次在上一个帖子的基础上使用UART,向电脑输出消息。
1. 在CCS中,打开工程里的”empty.syscfg”文件,先对UART进行一下设置。Launchpad上的UART使用的是PA8和PA9,因此需要在UART的PinMux中进行设置。其它的使用默认参数
2. 还需要一个延时函数,其提供了一个延时函数是delay_cycles(cycles) ,这个函数是按照时钟周期进行延时的,有点像nop函数。
3. TI提供的库函数中,包括轮询形式去发送或者接收1个字符,函数如下
- DL_UART_transmitDataBlocking()
- DL_UART_receiveDataBlocking()
下面的代码实现了串口发送的功能:
4. TI的库函数中,还提供了一些接收和发送的函数:
- void DL_UART_transmitData(UART_Regs *uart, uint8_t data)
- uint8_t DL_UART_receiveData(UART_Regs *uart)
这两个函数很基础,就是返回接收和发送寄存器的值,因此在使用之前需要确定,确实收到了数据,或者确实能够发送数据。
- bool DL_UART_transmitDataCheck(UART_Regs *uart, uint8_t data)
- bool DL_UART_receiveDataCheck(UART_Regs *uart, uint8_t *buffer)
这两个函数则是会去检查FIFO,也就是说会去确认是否收到了数据或者能够发送数据,如果发送或者接收成功则返回true。
5. 在上面的函数中提到了FIFO。这款芯片的UART是包含4个字节的发送FIFO和4个字节的接收FIFO的,有FIFO可以降低MCU处理数据的负担。FIFO默认是不开启的,没开启的时候就相当于是1个字节的FIFO了。如果想要开启,见下图。
6. 如果想实现不定长数据的接收,可以使用IDLE LINE模式,IDLE LINE模式下,当大于10出现大于10个位的高电平之后,就会置IDLE标志位,正好适合不定长数据的接收,设置方式如下图所示:
注意有个地址的设置,因为我们不去管地址位,因此需要将mask设置为0 。
这里要提交一个BUG,软件生成的初始化函数有错误,见下图。下图的两个函数,在库函数里是没有的,是生成的函数名字不对。正确的名字见下下图。
这两个函数要换成下图的这两个:
因此我们需要自己创建初始化函数,要不编译通不过。
初始化代码如下
DL_UART_Main_Config mygUART_0Config = {
.mode = DL_UART_MAIN_MODE_IDLE_LINE,
.direction = DL_UART_MAIN_DIRECTION_TX_RX,
.flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
.parity = DL_UART_MAIN_PARITY_NONE,
.wordLength = DL_UART_MAIN_WORD_LENGTH_8_BITS,
.stopBits = DL_UART_MAIN_STOP_BITS_ONE
};
void APP_DL_UART_0_init(void)
{
DL_UART_Main_init(UART_0_INST, (DL_UART_Main_Config *) &mygUART_0Config);
/* Set the address mask and the address to match */
DL_UART_setAddressMask(UART_0_INST, 0);
DL_UART_setAddress(UART_0_INST, 0);
DL_UART_Main_enable(UART_0_INST);
}
实现不定长数据接收,并回送回去的代码:
int main(void)
{
uint8_t str[50];
int i = 0,j;
SYSCFG_DL_init();
APP_DL_UART_0_init();
while (1) {
i = 0;
while(DL_UART_isIdleModeDetected(UART_0_INST) == false){
if(DL_UART_receiveDataCheck(UART_0_INST,&str[i]) == true){
i++;
}
}
for(j=0;j<i;j++){
DL_UART_transmitDataBlocking(UART_0_INST,str[j]);
}
}
}