M
例如:
#define UART_LEN_MAX 512
#define TIMEOUT_RX_MS 5
volatile uint8_t uart_recving_buffer[UART_LEN_MAX] = {0};
volatile uint16_t timer_rx_flag = 0,index_uart0 = 0;
volatile uint32_t add_up=0;
初始化串口
{
system_set_port_pull(GPIO_PD6,GPIO_PULL_UP,true);
/* set PA2 and PA3 for AT command interface */
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_6, PORTD6_FUNC_UART1_RXD);
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_7, PORTD7_FUNC_UART1_TXD);
Uart1_handle.UARTx = Uart1;
Uart1_handle.Init.BaudRate = gAT_buff_env.uart_param.BaudRate;
Uart1_handle.Init.DataLength = gAT_buff_env.uart_param.DataLength;
Uart1_handle.Init.StopBits = gAT_buff_env.uart_param.StopBits;
Uart1_handle.Init.Parity = gAT_buff_env.uart_param.Parity;
Uart1_handle.Init.FIFO_Mode = UART_FIFO_ENABLE;
uart_init_ex(&Uart1_handle);
NVIC_EnableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_IRQn, 4);
/enable recv and line status interrupt/
uart1_isr_int(&Uart1_handle);
co_printf("enter at init\r\n");
gAT_env.at_task_id = os_task_create( at_task_func );
__SYSTEM_TIMER_CLK_ENABLE();
pmu_set_pin_mux(GPIO_PORT_A, GPIO_BIT_6, PMU_PIN_FUNC_GPIO);
pmu_set_pin_to_PMU(GPIO_PORT_A, CO_BIT(6));
pmu_set_pin_dir(GPIO_PORT_A, BIT(6),GPIO_DIR_OUT);
NVIC_ClearPendingIRQ(TIMER0_IRQn);
NVIC_EnableIRQ(TIMER0_IRQn);
NVIC_SetPriority(TIMER0_IRQn, 2);
/* timer0 1s */
timer_init(Timer0, 96000, TIMER_DIV_NONE);
timer_start(Timer0);
}
串口中断
{
attribute((section("ram_code"))) void uart1_isr(void)
{
uint32_t isr_id;
uint8_t rx_char;
if(gap_get_connect_num()==1)
{
volatile struct_UART_t * const uart_reg_ram = (volatile struct_UART_t *)UART1_BASE;
isr_id = uart_reg_ram->FCR_IID.IID;
if(((isr_id & 0x04) == 0x04) || ((isr_id & 0x0c) == 0x0c)) //receciver data available or character timeout indication
{
while(uart_reg_ram->LSR.LSR_BIT.DR)
{
rx_char = uart_reg_ram->DATA_DLL.DATA;
uart_recving_buffer[index_uart0] = rx_char; //uart_reg_ram->DATA_DLL.DATA;
index_uart0++;
timer_rx_flag=1;
add_up = 1;
pmu_set_gpio_value(GPIO_PORT_A, BIT(6),1);
}
}
else if((isr_id & 0x06) == 0x06)//receiver line status interrupt
{
uint32_t tmp = uart_reg_ram->LSR.LSR_DWORD;
uart_reg_ram->FCR_IID.FCR = isr_id;
uart_reg_ram->IER_DLH.IER.ELSI = 0;
}
}
else
{
void uart1_isr_rom(void);
uart1_isr_rom();
}
}
}
接收超中断
{
attribute((section("ram_code"))) void timer0_isr(void)
{
static uint32_t lu32_Count = 0;
timer_int_clear(Timer0)
if(timer_rx_flag >= 1)
{
timer_rx_flag++;
if(timer_rx_flag >= TIMEOUT_RX_MS)
{
pmu_set_gpio_value(GPIO_PORT_A, BIT(6),0);
at_spss_send_data(gAT_ctrl_env.transparent_conidx, uart_recving_buffer, index_uart0);
timer_rx_flag = 0;
index_uart0 = 0;
}
}
}