论坛元老
 
- 积分
- 3661
- 金钱
- 3661
- 注册时间
- 2020-4-30
- 在线时间
- 260 小时
|
10金钱
最近搞WIFI无线传输,使用原子的8266模块发送数据到平板电脑
因为设备需要监控数据,所以使用状态机+串口空闲中断+DMA方案,代码写好后,测试了几次,能一步步的走下去,但在一次hardfault后,就再也进不了串口中断了
换过模块,模块没问题,串口本身也能正常通信,觉得很奇怪,请教下各位。
代码如下
- void UartGPRS_init(u32 bound) //串口1
- {
- //GPIO端口设置
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- DMA_InitTypeDef DMA_InitStructure;
-
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1时钟
-
-
- USART_DeInit(USART1); //复位串口1
- //USART1_TX PA.9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
-
- //USART1_RX PA.10
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA.8
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA8
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA.11
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA11
- GPIO_SetBits(GPIOA,GPIO_Pin_8); //模块IO_0引脚,上电拉高为运行模式;拉低为烧写模式,这个模式不用
- GPIO_SetBits(GPIOA,GPIO_Pin_11); //WIFI模块复位(低电平有效)上电拉高,
-
- //Usart1 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound; //一般设置为115200;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
- USART_Init(USART1, &USART_InitStructure); //初始化串口
-
- USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); //使能DMA接收请求
- USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启空闲中断
- USART_Cmd(USART1, ENABLE); //使能串口
-
-
- DMA_DeInit(DMA1_Channel5);
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART1->DR); //外设地址:USART1数据寄存器
- DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&usart1_rcv_buf; //内存地址:接收缓冲区
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向:外设→内存
- DMA_InitStructure.DMA_BufferSize = 128; //传输数据量
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不递增
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //普通模式开启,单次搬运,下次重新开始
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel5, &DMA_InitStructure);
- //配置完成后,启动DMA通道
- DMA_Cmd(DMA1_Channel5, ENABLE);
- }
复制代码- void USART1_IRQHandler(void)
- {
- /* 判断是否为空闲中断(IDLE) */
- if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
- {
- /* --- 清除IDLE标志:必须"先读SR,再读DR" --- */
- volatile uint16_t temp;
- temp = USART1->SR; // 先读状态寄存器
- temp = USART1->DR; // 再读数据寄存器(清除IDLE标志)
- (void)temp;
- /* --- 计算本次接收到的数据长度 --- */
- /* DMA_CNDTR寄存器保存的是剩余待传输的数据量 */
- // USART1_RxLen = USART1_RX_BUFFER_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);
- /* --- 置位接收完成标志,由主循环处理数据 --- */
- USART1_RxFlag = 1;
- /* --- 重新装载DMA,准备下一次接收 --- */
- DMA_Cmd(DMA1_Channel5, DISABLE); // 先关闭DMA
- DMA_SetCurrDataCounter(DMA1_Channel5, USART1_RX_BUFFER_SIZE);// 重设传输量
- DMA_Cmd(DMA1_Channel5, ENABLE); // 重新使能
- }
- }
复制代码
|
|