int main(void)
{
u8 t = 0;
u8 len;
uint16_t time = 0,time1 = 0,time2;
char outputStr[] = "TC1:TCACTCUR?\r";
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);// 设置中断优先级分组2
//溢出时间为1s
uart_init(9600); //串口初始化为9600
uart2_init(57600); //串口初始化为115200
uart3_init(115200); //串口初始化为115200
// YXIAN_init 是与业贤串口通信,但是但是二值量还没创建
/*是的,在 ISR 里对一个尚未创建(仍是 NULL)的 Semaphore 句柄调用 xSemaphoreGiveFromISR(),会直接解引用空指针 → 触发 HardFault。
在 Cortex-M 上,空指针解引用会立即跳转到 HardFault_Handler,所以你会看到“硬件异常”。
*/
YXIAN_init(); /*该函数会调用串口2与设备通信,在接受返回数据时会触发串口中断,内部存在一个二值信号量的释放,但是二值信号量此时还没被创立*/
stmflash_init( );//初始化下位机地址 读取寄存器里的值
printf("重启成功\r\n");
xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&StartTask_Handler);/*创建起始任务*/
vTaskStartScheduler(); /*开启多任务调度*/
while(1)
{
}
}
void USART2_IRQHandler(void) // 串口2中断服务程序
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
u8 Res;
#if SYSTEM_SUPPORT_OS // 如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS
OSIntEnter();
#endif
if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // 接收中断
{
LED0 = !LED0;
Res =USART_ReceiveData(USART2);
//printf("进入串口2的中断1\r\n");
USART2_RX_BUF[USART2_RX_STA++] = Res; // 读取接收到的数据
if (Res == 0x0D)
{
USART2_FLAS = 0x01;
USART2_RX_len = USART2_RX_STA ;
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
xSemaphoreGiveFromISR(YX_TO_STM32_USART2_Sem, &xHigherPriorityTaskWoken); // 释放二值信号量
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 如果唤醒任务优先级高,则立即切换
}
if (USART2_RX_STA >= USART_REC_LEN)
{
USART2_RX_STA = 0; // 超过缓冲区长度,重置状态
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志
{
USART_ClearFlag(USART2,USART_FLAG_ORE);
USART_ReceiveData(USART2);
USART2_RX_STA = 0;
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}