因为用M1S开发板使用RGB接口接屏幕,导致管脚占用比较多,剩下的GPIO40和GPIO41作为D0内核的交互串口,但是在使用时由于40、41管脚都是AON管脚,且默认管脚是XTAL32K,导致配置好之后只能UART发送,无法接收。使用的是M1S自带的SDK。IO管脚配置如下:请帮忙看一下问题出在哪儿了?
`static void bfl_c906_uart0_tx_rx_remap_gpio_init(void)
{
HBN_AON_PAD_CFG_Type aonPadCfg = {
DISABLE,
DISABLE,
DISABLE,
HBN_GPIO_PAD_PULL_NONE,
};
HBN_Aon_Pad_Cfg(DISABLE, HBN_AON_PAD_GPIO40, &aonPadCfg);
HBN_Aon_Pad_Cfg(DISABLE, HBN_AON_PAD_GPIO41, &aonPadCfg);
}上述是初始化40和41管脚,解除AON功能,
void bfl_main()
{
if(UART_TX_C906 == 40 || UART_RX_C906 == 41) //当使用RGB屏幕时需要使用11-15和40 41管脚,复用为普通IO管脚
{
bfl_c906_uart0_tx_rx_remap_gpio_init();
bfl_c906_gpio_11_to_gpio_15_remap_gpio_init();
}
bl_uart_c906_init(0, UART_TX_C906, UART_RX_C906, 0, 0, UART_BAUD_C906);
puts("Starting bl808 now....\r\n");
bl808_FreeRTOS_init();
puts("[OS] Starting aos_loop_proc task...\r\n");
xTaskCreate(aos_loop_proc, (char *)"event_loop", 1024, NULL, 15, NULL);
puts("[OS] Stop c906 xram handle...\r\n");
m1s_c906_xram_init();
puts("[OS] Starting OS Scheduler...\r\n");
vTaskStartScheduler();
}上述是C906内核初始化的时候的定义,其中端口定义如下
#define UART_ID_C906 (0)
#define UART_TX_C906 (40)
#define UART_RX_C906 (41)
#define UART_BAUD_C906 (115200)函数bl_uart_c906_init定义在bl_uart.c文件中,函数定义如下:
int bl_uart_c906_init(uint8_t id, uint8_t tx_pin, uint8_t rx_pin, uint8_t cts_pin, uint8_t rts_pin, uint32_t baudrate)
{
UART_CFG_Type uart_dbg_cfg = {
40 * 1000 * 1000, /UART clock/
baudrate, /* baudrate /
UART_DATABITS_8, / data bits /
UART_STOPBITS_1, / stop bits /
UART_PARITY_NONE, / parity /
DISABLE, / Disable auto flow control /
DISABLE, / Disable rx input de-glitch function /
DISABLE, / Disable RTS output SW control mode /
DISABLE, / Disable tx output SW control mode /
DISABLE, / Disable tx lin mode /
DISABLE, / Disable rx lin mode /
0, / Tx break bit count for lin mode /
UART_LSB_FIRST, / UART each data byte is send out LSB-first */
};
UART_FifoCfg_Type fifoCfg = {
16, /* TX FIFO threshold */
16, /* RX FIFO threshold */
DISABLE, /* Disable tx dma req/ack interface */
DISABLE /* Disable rx dma req/ack interface */
};
// GLB_GPIO_Type gpioPins[2] = {tx_pin,rx_pin};
// GLB_GPIO_Func_Init(GPIO_FUN_MM_UART,gpioPins,sizeof(gpioPins)/sizeof(gpioPins[0]));
#if 1
GLB_GPIO_Cfg_Type cfg;
cfg.pullType = GPIO_PULL_NONE;
cfg.drive = 0;
cfg.smtCtrl = 1;
/*set GPIO as UART TX */
cfg.gpioPin = tx_pin;
//cfg.gpioFun = uart_fun[id][0];
cfg.gpioFun = GPIO_FUN_MM_UART;
cfg.gpioMode = GPIO_MODE_AF;
GLB_GPIO_Init(&cfg);
/*set GPIO as UART RX */
cfg.gpioPin = rx_pin;
//cfg.gpioFun = uart_fun[id][1];
cfg.gpioFun = GPIO_FUN_MM_UART;
cfg.gpioMode = GPIO_MODE_AF;
GLB_GPIO_Init(&cfg);
#endif
/* init debug uart gpio first */
//gpio_init();
/* Init UART clock,Todo */
//GLB_Set_UART_CLK(ENABLE ,HBN_UART_CLK_160M,0);
//uart_dbg_cfg.uartClk=160*1000*1000;
if (baudrate != 0) {
uart_dbg_cfg.baudRate = baudrate;
}
/* Todo */
//if(UART0_ID==UART_DBG_ID){
// GLB_AHB_Slave1_Reset(BL_AHB_SLAVE1_UART0);
//}else if(UART1_ID==UART_DBG_ID){
// GLB_AHB_Slave1_Reset(BL_AHB_SLAVE1_UART1);
//}else{
// /* nothing */
//}
/* disable all interrupt */
UART_IntMask(id, UART_INT_ALL, MASK);
/* disable uart before config */
UART_Disable(id, UART_TXRX);
/* uart init with default configuration */
UART_Init(id, &uart_dbg_cfg);
/* UART fifo configuration */
UART_FifoConfig(id, &fifoCfg);
/* Enable tx free run mode */
UART_TxFreeRun(id, ENABLE);
/* Set rx time-out value */
UART_SetRxTimeoutValue(id, 80);
/* enable uart */
UART_Enable(id, UART_TXRX);
return 0;
}
_`
上述代码配置完成以后,C906内核开机正常打印日志,但是无法输入,CLI输入无响应。