opt脱毛属于医疗美容吗:stm32的一个UART应用

来源:百度文库 编辑:中财网 时间:2024/05/03 04:59:39

stm32的一个UART应用

一个基于STM32固件库的UART初始化配置程序,使用中断,并采用结构体控制串口流.
本文由戒往原创.非获得本人同意,严禁转载. 001/**********************************************************************002Name: STM32_UART.c003DESC: STM32的通用串口配置 004Author: 戒往 QQ:8926785005Copyright: http://isfate.com006***********************************************************************/007#include "Board_Driver.h"008 009/*******************************************************************************010* Function Name  : USART1_Init011* Description    : USART1的初始化012* Input          : None013* Output         : None014* Return         : None015*******************************************************************************/016void USART1_Init(void)017{018GPIO_InitTypeDef USART1_GPIO;                    //GPIO类型结构定义019USART_InitTypeDef USART_InitStructure;           //串口设置恢复默认参数020NVIC_InitTypeDef NVIC_InitStructure;021 022memset( (void*)&gCommCtrl, 0, sizeof(COMM_CTRL) );  //初始化gCommCtrl中的内存值023 024RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA025                      |RCC_APB2Periph_AFIO  ,ENABLE);026                                                 //使用USART1与GPIOA的时钟027                                                 //至于RCC_APB3Periph_AFIO有没必要不知道028//GPIO的设置029USART1_GPIO.GPIO_Pin=(GPIO_Pin_9);               //PA9是TX030USART1_GPIO.GPIO_Speed=GPIO_Speed_50MHz;         //蛋痛.为神马GPIO还要有个最快时钟031USART1_GPIO.GPIO_Mode=GPIO_Mode_AF_PP;           //NND,这个AF_PP弄得哥心碎啊,卡了几天,原来模式错了032GPIO_Init(GPIOA, &USART1_GPIO);                  //设置033 034USART1_GPIO.GPIO_Pin=(GPIO_Pin_10);              //PA10是RX035USART1_GPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING;     //RX,还是有外接10K上拉,所以开漏输入模式036GPIO_Init(GPIOA, &USART1_GPIO);                  //再设置037 038 039//初始化参数设置040USART_InitStructure.USART_BaudRate = 115200;                  //波特率115200041USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字长8位042USART_InitStructure.USART_StopBits = USART_StopBits_1;        //1位停止字节043USART_InitStructure.USART_Parity = USART_Parity_No;           //无奇偶校验044USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;045                                                              //无流控制046USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;047                                                              //打开Rx接收和Tx发送功能048USART_Init(USART1, &USART_InitStructure);                     //初始化049//USART_ITConfig(USART1, USART_IT_TC, ENABLE);               //STM32对发送中断支持十分拉圾.不能在初始化里启动050USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);               //初始化时只使能RX,不然一上电就会进入中断051USART_Cmd(USART1, ENABLE);                                    //启动串口052 053NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);              //配置为全部为响应级的中断054                                                             //这样相当于ARM7中的只有IRQ,没有FIQ??055/* Enable the USARTy Interrupt */056NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;            //这个值找了半天才找到057NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           //优先级 0058NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能中断059NVIC_Init(&NVIC_InitStructure);                              //进行配置060}061 062 063 064/*******************************************************************************065* Function Name  : USART1 IRQ Handler066* Description    : USART1 中断例程067* Input          : None068* Output         : None069* Return         : None070*******************************************************************************/071void USART1_IRQHandler(void)072{073u8 tmpIdx;074u8 tmpChar;075    /*     接收中断处理   */076if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)077  {078    tmpChar= USART_ReceiveData(USART1);         //取出数据,同时也是清除中断标记079    tmpIdx = gCommCtrl.rxHead;                  //取出当前buff的头指向080    CommRxBuff[ tmpIdx ] = tmpChar;             //把数据放到buff头里面081    tmpIdx = (tmpIdx + 1) % COMM_RXBUFF_LEN;    //buff头指向++082    if( gCommCtrl.rxTail != tmpIdx ) gCommCtrl.rxHead = tmpIdx; //如果缓冲区满,则无法保存下一次接收到的数据083  }084 085 086    /*     发送中断处理   */ 087if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)088  {089  tmpIdx = gCommCtrl.txTail;090  if( tmpIdx == gCommCtrl.txHead )                      //buff尾=头 发送完成091    {092    USART_ITConfig(USART1, USART_IT_TXE, DISABLE);      //禁止发送中断093    RS_TX_BUSY = 0;094    }095  else096    {097    USART_SendData(USART1, CommTxBuff[ tmpIdx ]);       //发送指向buff尾的那个数据098    gCommCtrl.txTail = (tmpIdx + 1) % COMM_TXBUFF_LEN;  //buff尾指向++099    RS_TX_BUSY = 1; 100    }      101  }102}103 104//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~105// 【CommPutch】通讯串口发送数据缓冲106//      此函数仅缓冲数据,具体发送同发送逻辑执行107//108// 【参数表】109//      u8  txChar    被发送的字节110//111// 【返回值】112//      u8      0: 缓冲区满113//              1: 缓冲成功114//____________________________________________________________________________115u8 CommPutch( u8 txChar )116{117    u8 tmpHead;118 119    tmpHead = (gCommCtrl.txHead + 1) % COMM_TXBUFF_LEN;120    if( tmpHead == gCommCtrl.txTail ) return 0;121    CommTxBuff[ gCommCtrl.txHead ] = txChar;122    gCommCtrl.txHead = tmpHead;123     124    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);      //使能发送中断就会立即产生一个发送中断.125    return 1;                                          //当发送缓冲里的数据发送完成后,在中断中进行屏蔽发送中断126}127 128//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~129// 【commCheckRx】通讯串口接收数据检测130//      此函数仅检测有无数据,具体读取由commGetch函数执行131//132// 【参数表】133//134// 【返回值】135//      INT08S      0: 无接收数据136//                  1: 有接收数据137//____________________________________________________________________________138u8 commCheckRx(void)139{140    if( gCommCtrl.rxHead != gCommCtrl.rxTail ) return 1;141 142    return 0;143}144 145//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~146// 【commGetch】通讯串口读取数据147//      只有commCheckRx函数返回成功后才可以调用本函数。148//      否则将破坏接收缓冲区。149//150// 【参数表】151//152// 【返回值】153//      INT08U      读取的数据154//____________________________________________________________________________155u8 commGetch(void)156{157    u8 rtnChar;158 159    // 一定要先取出数据,才能更新数组尾标160    rtnChar = CommRxBuff[ gCommCtrl.rxTail ];161    gCommCtrl.rxTail = (gCommCtrl.rxTail + 1) % COMM_RXBUFF_LEN;162 163    return rtnChar;164}165 166//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~167// 【commSendStr】通讯串口发送字符串168//      169// 【参数表】170//      pStr        被发送字符串地址,字符串以0x00结尾。171//172// 【返回值】173//      无174//____________________________________________________________________________175void commSendStr( u8* pStr )176{177    u8 txChar;178 179    while(1)180    {181        txChar = *pStr++;182        if( txChar == 0 ) break;183        while( 0 == CommPutch( txChar ) );184    }185 186    return;187}