#include "main.h" #define UART0_BUFF_MAX 256 __align(4) uint8_t cmd0_buf[UART0_BUFF_MAX]; __IO uint32_t cmd0_length = 0; __IO uint8_t cmd0_active = 0; __align(4) uint8_t uart0_buf[UART0_BUFF_MAX]; __IO uint32_t uart0_index = 0; void uart0_putchar(uint8_t ch) { while(UART_IsTXFIFOFull(UART0)) {;} UART0->DATA = ch; } //void uart0_putchar(uint8_t ch){UART_WriteByte(UART0, ch);while(UART_IsTXBusy(UART0)){;}} void uart0_putbuf(uint8_t *buf, uint32_t len) { while(len--) { uart0_putchar(*buf++); } } void uart0_puts(char *str) { while(*str) { uart0_putchar((int)*str++); } } uint32_t uart0_getbuf(uint8_t *buf) { while(!cmd0_active) { DelayMs(1); } memcpy(buf, cmd0_buf, cmd0_length); cmd0_active = 0; return cmd0_length; } void UART0Init(void) { UART_InitStructure UART_initStruct; // PORT_Init(PORTC, PIN2, FUNMUX0_UART0_RXD, 1); //GPIOC.2 配置为UART0输入引脚 // PORT_Init(PORTC, PIN3, FUNMUX1_UART0_TXD, 0); //GPIOC.3 配置为UART0输出引脚 PORT_Init(PORTB, PIN2, FUNMUX0_UART0_RXD, 1); //GPIOB.2 配置为UART0输入引脚 PORT_Init(PORTB, PIN1, FUNMUX1_UART0_TXD, 0); //GPIOB.1 配置为UART0输出引脚 UART_initStruct.Baudrate = 115200; UART_initStruct.DataBits = UART_DATA_8BIT; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT UART_initStruct.Parity = UART_PARITY_NONE; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO UART_initStruct.StopBits = UART_STOP_1BIT; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT UART_initStruct.TXThreshold = 0; //取值0--7 UART_initStruct.TXThresholdIEn = 0; //当TX FIFO中数据个数 <= TXThreshold时触发中断 UART_initStruct.RXThreshold = 7; //取值0--7 UART_initStruct.RXThresholdIEn = 1; //当RX FIFO中数据个数 >= RXThreshold时触发中断 UART_initStruct.TimeoutTime = 20; //超时时长 = TimeoutTime/(Baudrate/10) 秒 = 254/11520 = 22.05 MS UART_initStruct.TimeoutIEn = 1; //超时中断,超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断 UART_Init(UART0, &UART_initStruct); NVIC_SetPriority(UART0_IRQn, 4); UART_Open(UART0); } void UART0_Handler(void) { uint32_t tmp; if(UART_INTRXThresholdStat(UART0))//阈值中断 { // uart0_putchar('*');//测试阈值中断 for(uint16_t i = 0; i < 6; i++) //读取6个字节,留1个给超时中断再读,否则缓冲空了产生不了超时中断 { if(UART_ReadByte(UART0, &tmp) == 0) { if(uart0_index >= UART0_BUFF_MAX) { uart0_index = 0; //防止缓冲溢出重新把接收指针指向缓冲开始 } uart0_buf[uart0_index++] = tmp; //读取字符 } else { uart0_index = 0; //字符出错丢弃后重新把接收指针指向缓冲开始 } } } if(UART_INTTimeoutStat(UART0)) //超时中断 { // uart0_putchar('#');//测试超时中断 while(UART_IsRXFIFOEmpty(UART0) == 0) { if(UART_ReadByte(UART0, &tmp) == 0) { if(uart0_index >= UART0_BUFF_MAX) { uart0_index = 0; //防止缓冲溢出重新把接收指针指向缓冲开始 } uart0_buf[uart0_index++] = tmp; //读取字符 } else { uart0_index = 0; //字符出错丢弃后重新把接收指针指向缓冲开始 } } memcpy(cmd0_buf, uart0_buf, uart0_index); //超时了,就是数据包结束了,取走全部数据 cmd0_length = uart0_index; uart0_index = 0; cmd0_active = 1; //取走接收数据长度并重新把接收指针指向缓冲开始,表明数据有效 } } int fputc(int ch, FILE *f) { UART_WriteByte(UART0, ch); while(UART_IsTXBusy(UART0)) {;} return ch; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define UART3_BUFF_MAX 256 __align(4) uint8_t cmd3_buf[UART3_BUFF_MAX]; __IO uint32_t cmd3_length = 0; __IO uint8_t cmd3_active = 0; __align(4) uint8_t uart3_buf[UART3_BUFF_MAX]; __IO uint32_t uart3_index = 0; void uart3_putchar(uint8_t ch) { while(UART_IsTXFIFOFull(UART3)) {;} UART3->DATA = ch; } //void uart3_putchar(uint8_t ch){UART_WriteByte(UART3, ch);while(UART_IsTXBusy(UART3)){;}} void uart3_putbuf(uint8_t *buf, uint32_t len) { while(len--) { uart3_putchar(*buf++); } } void uart3_puts(char *str) { while(*str) { uart3_putchar((int)*str++); } } uint32_t uart3_getbuf(uint8_t *buf) { while(!cmd3_active) { DelayMs(1); } memcpy(buf, cmd3_buf, cmd3_length); cmd3_active = 0; return cmd3_length; } void UART3Init(void) { UART_InitStructure UART_initStruct; // PORT_Init(PORTB, PIN2, FUNMUX0_UART3_RXD, 1); //GPIOB.2 配置为UART3输入引脚 // PORT_Init(PORTB, PIN1, FUNMUX1_UART3_TXD, 0); //GPIOB.1 配置为UART3输出引脚 PORT_Init(PORTC, PIN2, FUNMUX0_UART3_RXD, 1); //GPIOC.2 配置为UART3输入引脚 PORT_Init(PORTC, PIN3, FUNMUX1_UART3_TXD, 0); //GPIOC.3 配置为UART3输出引脚 UART_initStruct.Baudrate = 115200; UART_initStruct.DataBits = UART_DATA_8BIT; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT UART_initStruct.Parity = UART_PARITY_NONE; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO UART_initStruct.StopBits = UART_STOP_1BIT; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT UART_initStruct.TXThreshold = 0; //取值0--7 UART_initStruct.TXThresholdIEn = 0; //当TX FIFO中数据个数 <= TXThreshold时触发中断 UART_initStruct.RXThreshold = 7; //取值0--7 UART_initStruct.RXThresholdIEn = 1; //当RX FIFO中数据个数 >= RXThreshold时触发中断 UART_initStruct.TimeoutTime = 254; //超时时长 = TimeoutTime/(Baudrate/10) 秒 = 16/25000 = 640uS UART_initStruct.TimeoutIEn = 1; //超时中断,超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断 UART_Init(UART3, &UART_initStruct); NVIC_SetPriority(UART3_IRQn, 3); UART_Open(UART3); } void UART3_Handler(void) { uint32_t tmp; if(UART_INTRXThresholdStat(UART3))//阈值中断 { for(uint16_t i = 0; i < 6; i++) //读取6个字节,留1个给超时中断再读,否则缓冲空了产生不了超时中断 { //printf("#"); //txt_index3++; if(UART_ReadByte(UART3, &tmp) == 0) { if(uart3_index >= UART3_BUFF_MAX) { uart3_index = 0; //防止缓冲溢出重新把接收指针指向缓冲开始 } uart3_buf[uart3_index++] = tmp; //读取字符 } else { uart3_index = 0; //字符出错丢弃后重新把接收指针指向缓冲开始 } } } else if(UART_INTTimeoutStat(UART3)) //超时中断 { while(UART_IsRXFIFOEmpty(UART3) == 0) { //printf("*"); //txt_index3++; if(UART_ReadByte(UART3, &tmp) == 0) { if(uart3_index >= UART3_BUFF_MAX) { uart3_index = 0; //防止缓冲溢出重新把接收指针指向缓冲开始 } uart3_buf[uart3_index++] = tmp; //读取字符 } else { uart3_index = 0; //字符出错丢弃后重新把接收指针指向缓冲开始 } } memcpy(cmd3_buf, uart3_buf, uart3_index); //超时了,就是数据包结束了,取走全部数据 cmd3_length = uart3_index; uart3_index = 0; cmd3_active = 1; //取走接收数据长度并重新把接收指针指向缓冲开始,表明数据有效 //printf("A=%d\n\r",txt_index3);txt_index3=0; //printf("L=%d\n\r",dmx_length3); //for(int i=0;i<11;i++){printf("%x ",dmx_buf3[i]);} } else { //printf("EEE%x %x\n\r",UART3->CTRL,UART3->DATA); } }