接着上次的《stm32实用循环buffer》,给大家提供一个参考实例,根据实际情况改改就能用。
- /******************************************************************************
- * [url=home.php?mod=space&uid=288409]@file[/url] : usart2.c
- * [url=home.php?mod=space&uid=187600]@author[/url] : qianxin.chen@qq.com
- * [url=home.php?mod=space&uid=895143]@version[/url] : V0.0.1
- * [url=home.php?mod=space&uid=212281]@date[/url] : 20-February-2020
- * @Brief : This file provides all the usart2 functions.
- ******************************************************************************
- * @Attention:
- * Non
- *
- ******************************************************************************/
- /* Includes -----------------------------------------------------------------*/
- #include "includes.h"
- #include "usart2.h"
- #include "fifo.h" //fifo头文件
- #include "crc.h" //用于校验
- #include "usart1.h" //用于printf打印
-
- /* Define -------------------------------------------------------------------*/
- #define USART2_FIFO_LEN 64
- #define FRAME_HEAD1 0xAA
- #define FRAME_TAIL1 0x55
- #define FRAME_TAIL2 0x55
- #define FRAME_LEN 5
- #define complement(a) (FRAME_LEN-a)
-
- /* Variables ----------------------------------------------------------------*/
- struct fifo fifo2;
- static unsigned char copy_len = FRAME_LEN;
- #ifdef FIX_BUFFER //用于区分固定分配或动态分配buffer
- unsigned char fifo_buf[USART2_FIFO_LEN];
- #endif
-
- /* Functions ----------------------------------------------------------------*/
- /* must init this function */
- void init_usart2_fifo(void)
- {
- signed int ret;
-
- ret = fifo_alloc(&fifo2, USART2_FIFO_LEN);
- #ifdef FIX_BUFFER
- ret = fifo_init(&fifo2, fifo_buf, USART2_FIFO_LEN);
- #endif
- if(ret<0){
- printf("fifo2 alloc fail!\n");
- }
- }
-
- void usart2_Init(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
-
- USART_DeInit(USART2);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- USART_InitStructure.USART_BaudRate = bound;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- 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(USART2, &USART_InitStructure);
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
-
- USART_Cmd(USART2, ENABLE);
- }
-
- void usart2_send_data(u8 *sdata, u8 len)
- {
- u8 i;
-
- GPIO_ResetBits(GPIOA, GPIO_Pin_4);
- USART_ClearFlag(USART2,USART_FLAG_TC);
- for(i=0;i<len;i++)
- {
- USART_SendData(USART2, sdata[i]);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)!=SET);
- }
- GPIO_SetBits(GPIOA, GPIO_Pin_4);
- }
-
- void USART2_IRQHandler(void)
- {
- unsigned int ret;
- unsigned char buf[1];
-
- OSIntEnter(); //如果没有用ucos屏蔽此行
- if(USART_GetITStatus(USART2, USART_IT_RXNE)!= RESET){
- USART_ClearITPendingBit(USART2,USART_IT_RXNE);
- buf[0] = USART_ReceiveData(USART2);
- ret = fifo_in(&fifo2, buf, 1);
- if(ret<1){
- printf("fifo2 in err!\n");
- }
- }
- OSIntExit(); //如果没有用ucos屏蔽此行
- }
-
- /* 在buffer中查找、校验符合条件的帧数据 */
- void usart2_data_handler(void)
- {
- unsigned int len;
- unsigned char buf[FRAME_LEN];
- /* 执行到这里的时候,只要有数据就循环处理,直到处理完数据 */
- while((fifo_used(&fifo2))>((copy_len))){
- len = fifo_out(&fifo2, buf+complement(copy_len), (copy_len)); //fifo中提取需要的长度字节
- if(len <1){
- printf("usart2 fifo out err!\n");
- }
- /* 校验帧头、帧尾、和crc校验 */
- //if(buf[0] == FRAME_HEAD1 && buf[FRAME_LEN-1]==FRAME_TAIL1 && buf[FRAME_LEN-1]==FRAME_TAIL2
- //&& (buf[sizeof(buf)-2] == crc8_maxim(buf+CRC_OFFSET, (sizeof(buf)-SIZE_SUB+1)))){
- /* 只校验帧头、帧尾 */
- if(buf[0] == FRAME_HEAD1 && buf[FRAME_LEN-1]==FRAME_TAIL1 && buf[FRAME_LEN-1]==FRAME_TAIL2){
- copy_len=FRAME_LEN;
- {
- /* 帧数据处理 */
- }
- continue;
- }
- else{
- /* 不符合帧数据条件,循环查找帧头,并把找到的帧头移动到buf的前面,下次提取的数据附加在后边 */
- for(copy_len=1;copy_len<FRAME_LEN;copy_len++){
- if(buf[copy_len] == FRAME_HEAD1){
- memcpy(buf,buf+copy_len,(complement(copy_len)));
- break;
- }
- }
- }
- }
- }
|