stm32 NRF24L01+USART搞定有线和无线通信
时间:11-19
来源:互联网
点击:
还要回过头说说我们的USART和NRF24L01,他们的初始化要看main函数中的BSP_Init();函数,该函数负相关硬件的初始化设置(中文意思是板级支持包初始化函数,因为uc-OS可以并不只限于stm32单片机,所以这里要根据不同平台进行相应的设置)。该函数位于bsp.c函数中,其作用相当于将以前我们在main函数中进行的相关硬件初始化单独拿出来封装成一个函数而已~但是,串口和无线对应的中断接收程序却有点不一样,因为这里是操作系统,所以在每个中断子程序前要调用OS_ENTER_CRITICAL();保存当前的全局中断标志,然后OSIntNesting++;中断嵌套深度加1,最后调用OS_EXIT_CRITICAL();恢复全局中断标志进入正常的中断处理,此外在中断响应函数最后要调用OSIntExit(); 检测如果有更高优先级的任务就绪了,则执行一次任务切换。
1 /*******************************************************************************2 * Function Name : USART1_IRQHandler3 * Description : This function handles USART1 global interrupt request.4 * Input : None5 * Output : None6 * Return : None7 *******************************************************************************/8 void USART1_IRQHandler(void)9 { 10 unsigned int i;11 OS_CPU_SR cpu_sr;12 OS_ENTER_CRITICAL(); //保存全局中断标志,关总中断 Tell uC/OS-II that we are starting an ISR13 OSIntNesting++;14 OS_EXIT_CRITICAL(); //恢复全局中断曛? 15 16 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断读寄存器是否非空17 { 18 RxBufferUSART[RxCounter1++] = USART_ReceiveData(USART1); //将读寄存器的数据缓存到接收缓冲区里19 if(RxBufferUSART[RxCounter1-2]==0x0d&&RxBufferUSART[RxCounter1-1]==0x0a) //判断结束标志是否是0x0d 0x0a20 {21 for(i=0; i< RxCounter1; i++) TxBufferRF[i] = RxBufferUSART[i]; //将接收缓冲器的数据转到发送缓冲区,准备转发22 usart_rec_flag=1; //接收成功标志23 TxBufferRF[RxCounter1]=0; //发送缓冲区结束符 24 TxCounter1=RxCounter1;25 RxCounter1=0;26 }27 }28 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG 29 { 30 USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止发缓冲器空中断, 31 } 32 OSIntExit(); //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换 33 }34 /////////////////////////////35 void EXTI0_IRQHandler(void)36 { 37 unsigned char status,i;38 OS_CPU_SR cpu_sr;39 OS_ENTER_CRITICAL(); //保存全局中断标志,关总中断 Tell uC/OS-II that we are starting an ISR40 OSIntNesting++;41 OS_EXIT_CRITICAL(); //恢复全局中断标志 42 43 if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断是否产生了EXTI0中断44 {45 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){ //判断是否是PA0线变低 46 status=SPI_Read(READ_REG1+STATUS); // 读取状态寄存其来判断数据接收状况 47 if(status & 0x40) // 判断是否接收到数据 48 { 49 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); //从接收缓冲区里读出数据 50 for(i=0; i<32; i++){ //向USB 端点1的缓冲区里放置数据51 TxBufferUSART[i] = rx_buf[i]; 52 }53 rf_rec_flag=1; 54 if((status&0x0e)<=0x0a){ 55 nrf_Pipe_r=(status&0x0e)>>1; //读出是在哪个通道接收的56 }57 else nrf_Pipe_r=0; 58 Rx_Succ=1; //读取数据完成标志59 /* 根据读出的接收通道号,将相应信息写入状态文本缓冲区 */60 if(nrf_Pipe_r==0) memcpy(status_buf, "Pipe 0 Recive OK! ", 20); 61 else if(nrf_Pipe_r==1) memcpy(status_buf, "Pipe 1 Recive OK! ", 20);62 else if(nrf_Pipe_r==2) memcpy(status_buf, "Pipe 2 Recive OK! ", 20);63 else if(nrf_Pipe_r==3) memcpy(status_buf, "Pipe 3 Recive OK! ", 20);64 else if(nrf_Pipe_r==4) memcpy(status_buf, "Pipe 4 Recive OK! ", 20);65 else if(nrf_Pipe_r==5) memcpy(status_buf, "Pipe 5 Recive OK! ", 20);66 }67 else if((status &0x10)>0){ //发射达到最大复发次数 68 SPI_RW_Reg(0xe1,0); //清除发送缓冲区 69 RX_Mode(); //进入接收模式 70 Rx_Succ=1; 71 /* 根据发送通道,将相应信息写入状态文本缓冲区 */72 if(nrf_Pipe==0) memcpy(status_buf, "Pipe 0 NO ACK! ", 20);73 else if(nrf_Pipe==1) memcpy(status_buf, "Pipe 1 NO ACK! ", 20);74 else if(nrf_Pipe==2) memcpy(status_buf, "Pipe 2 NO ACK! ", 20);75 else if(nrf_Pipe==3) memcpy(status_buf, "Pipe 3 NO ACK! ", 20); 76 else if(nrf_Pipe==4) memcpy(status_buf, "Pipe 4 NO ACK! ", 20);77 else if(nrf_Pipe==5) memcpy(status_buf, "Pipe 5 NO ACK! ", 20); 78 }79 else if((status &0x20)>0){ //发射后收到应答 80 SPI_RW_Reg(0xe1,0); //清除发送缓冲区 81 RX_Mode(); //进入接收模式82 Rx_Succ=1;83 /* 根据发送通道,将相应信息写入状态文本缓冲区 */84 if(nrf_Pipe==0) memcpy(status_buf, "Pipe 0 Send OK! ", 20);85 else if(nrf_Pipe==1) memcpy(status_buf, "Pipe 1 Send OK! ", 20);86 else if(nrf_Pipe==2) memcpy(status_buf, "Pipe 2 Send OK! ", 20);87 else if(nrf_Pipe==3) memcpy(status_buf, "Pipe 3 Send OK! ", 20);88 else if(nrf_Pipe==4) memcpy(status_buf, "Pipe 4 Send OK! ", 20);89 else if(nrf_Pipe==5) memcpy(status_buf, "Pipe 5 Send OK! ", 20); 90 }91 92 SPI_RW_Reg(WRITE_REG1+STATUS, status); //清除07寄存器标志 93 } 94 EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0上的中断标志 95 } 96 OSIntExit(); //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换 97 }
stm32NRF24L01USART无线通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)