杰理AC692X系列—UART串口通讯(10)
PS:之前入门的时候太煎熬了,所以我写这些是为了给刚入门的看看,少走弯路,共同进步。(哪里有错!请喷我!我改!!)
1、重写初始化串口:
我是从原先的uart_debug_int(DEBUG_UART_RATE);把需要用到的拉了出来重写了个初始化函数,
/********************************************************************************/
//------------------------------自定义配置
/********************************************************************************/
#define DYD_UART_EN
// #define DYD_PRINTF_EN //只关闭printf打印,不影响串口通讯
#define DYD_UART_RATE 9600
我使用的是DMDP做的通讯口
void user_uart_init(u32 baud_rate)
{
#if !EQ_UART_DEBUG
uart_module_on();
JL_IOMAP->CON1 |= BIT(3) | BIT(2);
JL_USB->CON0 = (BIT(0));//USB_PHY_ON
JL_USB->IO_CON0 = (BIT(11) | BIT(10) | BIT(9)); //USB_IO_MODE //DMDIE //DPDIE
JL_USB->IO_CON0 |= BIT(0); //TX DP
JL_USB->IO_CON0 |= BIT(3);//RX DM
JL_USB->IO_CON0 &= ~BIT(2);//tx dp
JL_USB->IO_CON0 &= ~BIT(5);//DM下拉
JL_USB->IO_CON0 &= ~BIT(7);//DM上拉
JL_UART1->BAUD = (UART_CLK / baud_rate) / 4 - 1;
JL_UART1->CON0 = BIT(14) | BIT(13) | BIT(12) | BIT(10) | BIT(3) | BIT(0);
uart_info[1].callback_fun = user_common_uart_isr; //接收到东西会跑这个中断函数
IRQ_REQUEST(IRQ_UART1_IDX, uart1_isr_fun);
irq_set_prio(IRQ_UART1_IDX, 3); //设置中断优先级为3,(最高为3)
#ifdef DYD_PRINTF_EN
register_handle_printf_putchar(user_putchar); //注册printf打印
#endif
#endif
}
2、重写发送函数:
原先的它用__DEBUG框起来的。我不想改它原来的(改成bug还得找,麻烦),于是买它!!换汤不换药。
//发送字符串
void user_uart_tx_str(char *str,u8 len)
{
extern void delay_nms(u32 n);
u8 tx_len,i;
tx_len = len;
i=0;
while(tx_len)
{
user_uart_tx(*(str+i));
i++;
tx_len--;
}
}
初始化和发送也搞好了,接下来就是接收了
3、接收中断函数:
没错接收中断函数这里,我也是重写的!回头去看初始化那有个
uart_info[1].callback_fun = user_common_uart_isr; //接收到东西会跑这个中断函数
void user_common_uart_isr(u8 uto_buf, void *p, u8 isr_flag)
{
if(UART_ISR_TYPE_DATA_COME == isr_flag){//看字面意思就知道是接收到数据了
if(uto_buf!=0x00&&uto_buf != ' ')/*问:为什么要加这句判断呢?*/
{
//在这里添加你的处理消息
}
}
答:我记得是这样的。不加这句在平常用串口模拟的时候是没问题,但是一旦手机连接播放的时候,你就会接收到这两个东西,可能会造成接收出错,自己测下看看加不加就行,问题不大。
4、关了系统打印,又想看自己的打印:
按照我那样初始化后打开这个宏就行
// #define DYD_PRINTF_EN //只关闭printf打印,不影响串口通讯
END!!!