久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

stm32的一個(gè)UART應(yīng)用

 Aaronwy 2011-12-27

 
001 /**********************************************************************
002 Name: STM32_UART.c
003 DESC: STM32的通用串口配置
004 Author: 戒往 QQ:8926785
005 Copyright: http://
006 ***********************************************************************/
007 #include "Board_Driver.h"
008  
009 /*******************************************************************************
010 * Function Name  : USART1_Init
011 * Description    : USART1的初始化
012 * Input          : None
013 * Output         : None
014 * Return         : None
015 *******************************************************************************/
016 void USART1_Init(void)
017 {
018 GPIO_InitTypeDef USART1_GPIO;                    //GPIO類型結(jié)構(gòu)定義
019 USART_InitTypeDef USART_InitStructure;           //串口設(shè)置恢復(fù)默認(rèn)參數(shù)
020 NVIC_InitTypeDef NVIC_InitStructure;
021  
022 memset( (void*)&gCommCtrl, 0, sizeof(COMM_CTRL) );  //初始化gCommCtrl中的內(nèi)存值
023  
024 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA
025                       |RCC_APB2Periph_AFIO  ,ENABLE);
026                                                  //使用USART1與GPIOA的時(shí)鐘
027                                                  //至于RCC_APB3Periph_AFIO有沒必要不知道
028 //GPIO的設(shè)置
029 USART1_GPIO.GPIO_Pin=(GPIO_Pin_9);               //PA9是TX
030 USART1_GPIO.GPIO_Speed=GPIO_Speed_50MHz;         //蛋痛.為神馬GPIO還要有個(gè)最快時(shí)鐘
031 USART1_GPIO.GPIO_Mode=GPIO_Mode_AF_PP;           //NND,這個(gè)AF_PP弄得哥心碎啊,卡了幾天,原來模式錯(cuò)了
032 GPIO_Init(GPIOA, &USART1_GPIO);                  //設(shè)置
033  
034 USART1_GPIO.GPIO_Pin=(GPIO_Pin_10);              //PA10是RX
035 USART1_GPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING;     //RX,還是有外接10K上拉,所以開漏輸入模式
036 GPIO_Init(GPIOA, &USART1_GPIO);                  //再設(shè)置
037  
038  
039 //初始化參數(shù)設(shè)置
040 USART_InitStructure.USART_BaudRate = 115200;                  //波特率115200
041 USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字長(zhǎng)8位
042 USART_InitStructure.USART_StopBits = USART_StopBits_1;        //1位停止字節(jié)
043 USART_InitStructure.USART_Parity = USART_Parity_No;           //無奇偶校驗(yàn)
044 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
045                                                               //無流控制
046 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
047                                                               //打開Rx接收和Tx發(fā)送功能
048 USART_Init(USART1, &USART_InitStructure);                     //初始化
049 //USART_ITConfig(USART1, USART_IT_TC, ENABLE);               //STM32對(duì)發(fā)送中斷支持十分拉圾.不能在初始化里啟動(dòng)
050 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);               //初始化時(shí)只使能RX,不然一上電就會(huì)進(jìn)入中斷
051 USART_Cmd(USART1, ENABLE);                                    //啟動(dòng)串口
052  
053 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);              //配置為全部為響應(yīng)級(jí)的中斷
054                                                              //這樣相當(dāng)于ARM7中的只有IRQ,沒有FIQ??
055 /* Enable the USARTy Interrupt */
056 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;            //這個(gè)值找了半天才找到
057 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;           //優(yōu)先級(jí) 0
058 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能中斷
059 NVIC_Init(&NVIC_InitStructure);                              //進(jìn)行配置
060 }
061  
062  
063  
064 /*******************************************************************************
065 * Function Name  : USART1 IRQ Handler
066 * Description    : USART1 中斷例程
067 * Input          : None
068 * Output         : None
069 * Return         : None
070 *******************************************************************************/
071 void USART1_IRQHandler(void)
072 {
073 u8 tmpIdx;
074 u8 tmpChar;
075     /*     接收中斷處理   */
076 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
077   {
078     tmpChar= USART_ReceiveData(USART1);         //取出數(shù)據(jù),同時(shí)也是清除中斷標(biāo)記
079     tmpIdx = gCommCtrl.rxHead;                  //取出當(dāng)前buff的頭指向
080     CommRxBuff[ tmpIdx ] = tmpChar;             //把數(shù)據(jù)放到buff頭里面
081     tmpIdx = (tmpIdx + 1) % COMM_RXBUFF_LEN;    //buff頭指向++
082     if( gCommCtrl.rxTail != tmpIdx ) gCommCtrl.rxHead = tmpIdx; //如果緩沖區(qū)滿,則無法保存下一次接收到的數(shù)據(jù)
083   }
084  
085  
086     /*     發(fā)送中斷處理   */ 
087 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
088   {
089   tmpIdx = gCommCtrl.txTail;
090   if( tmpIdx == gCommCtrl.txHead )                      //buff尾=頭 發(fā)送完成
091     {
092     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);      //禁止發(fā)送中斷
093     RS_TX_BUSY = 0;
094     }
095   else
096     {
097     USART_SendData(USART1, CommTxBuff[ tmpIdx ]);       //發(fā)送指向buff尾的那個(gè)數(shù)據(jù)
098     gCommCtrl.txTail = (tmpIdx + 1) % COMM_TXBUFF_LEN;  //buff尾指向++
099     RS_TX_BUSY = 1;
100     }     
101   }
102 }
103  
104 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105 // 【CommPutch】通訊串口發(fā)送數(shù)據(jù)緩沖
106 //      此函數(shù)僅緩沖數(shù)據(jù),,具體發(fā)送同發(fā)送邏輯執(zhí)行
107 //
108 // 【參數(shù)表】
109 //      u8  txChar    被發(fā)送的字節(jié)
110 //
111 // 【返回值】
112 //      u8      0: 緩沖區(qū)滿
113 //              1: 緩沖成功
114 //____________________________________________________________________________
115 u8 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);      //使能發(fā)送中斷就會(huì)立即產(chǎn)生一個(gè)發(fā)送中斷.
125     return 1;                                          //當(dāng)發(fā)送緩沖里的數(shù)據(jù)發(fā)送完成后,在中斷中進(jìn)行屏蔽發(fā)送中斷
126 }
127  
128 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129 // 【commCheckRx】通訊串口接收數(shù)據(jù)檢測(cè)
130 //      此函數(shù)僅檢測(cè)有無數(shù)據(jù),,具體讀取由commGetch函數(shù)執(zhí)行
131 //
132 // 【參數(shù)表】
133 //
134 // 【返回值】
135 //      INT08S      0: 無接收數(shù)據(jù)
136 //                  1: 有接收數(shù)據(jù)
137 //____________________________________________________________________________
138 u8 commCheckRx(void)
139 {
140     if( gCommCtrl.rxHead != gCommCtrl.rxTail ) return 1;
141  
142     return 0;
143 }
144  
145 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
146 // 【commGetch】通訊串口讀取數(shù)據(jù)
147 //      只有commCheckRx函數(shù)返回成功后才可以調(diào)用本函數(shù)。
148 //      否則將破壞接收緩沖區(qū),。
149 //
150 // 【參數(shù)表】
151 //
152 // 【返回值】
153 //      INT08U      讀取的數(shù)據(jù)
154 //____________________________________________________________________________
155 u8 commGetch(void)
156 {
157     u8 rtnChar;
158  
159     // 一定要先取出數(shù)據(jù),,才能更新數(shù)組尾標(biāo)
160     rtnChar = CommRxBuff[ gCommCtrl.rxTail ];
161     gCommCtrl.rxTail = (gCommCtrl.rxTail + 1) % COMM_RXBUFF_LEN;
162  
163     return rtnChar;
164 }
165  
166 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167 // 【commSendStr】通訊串口發(fā)送字符串
168 //     
169 // 【參數(shù)表】
170 //      pStr        被發(fā)送字符串地址,字符串以0x00結(jié)尾,。
171 //
172 // 【返回值】
173 //      無
174 //____________________________________________________________________________
175 void 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 }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多