www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]功能:PC端發(fā)送一個(gè)特定的字符:0x0d0x0a,單片機(jī)則返回一句話,如圖:>_1、復(fù)用功能I/O和調(diào)試配置(AFIO)為了優(yōu)化外設(shè)數(shù)目,可以把一些復(fù)用功能重新映射到其他引腳上。設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)

功能:PC端發(fā)送一個(gè)特定的字符:0x0d0x0a,單片機(jī)則返回一句話,如圖:

>_

1、復(fù)用功能I/O和調(diào)試配置(AFIO)

為了優(yōu)化外設(shè)數(shù)目,可以把一些復(fù)用功能重新映射到其他引腳上。設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)(參見0節(jié))實(shí)現(xiàn)引腳的重新映射。這時(shí),復(fù)用功能不再映射到它們的原始分配上。

2、嵌套向量中斷控制器(NVIC)

l43個(gè)可屏蔽中斷通道(不包含16個(gè)Cortex-M3的中斷線);

l16個(gè)可編程的優(yōu)先等級(jí);

l低延遲的異常和中斷處理;

l電源管理控制;

l系統(tǒng)控制寄存器的實(shí)現(xiàn);

l嵌套向量中斷控制器(NVIC)和處理器核的接口緊密相連,可以實(shí)現(xiàn)低延遲的中斷處理和有效處理地處理晚到的中斷。

PS:

  a、SysTick:系統(tǒng)嘀嗒校準(zhǔn)值固定到9000,當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9兆赫,產(chǎn)生1ms時(shí)基。

  b、中斷和異常向量:【中斷向量表】

3、USART通用同步異步收發(fā)器(USART)

它支持同步單向通信和半雙工單線通信

任何USART雙向通信至少需要兩個(gè)腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。

a、RX:接收數(shù)據(jù)串行輸。通過過采樣技術(shù)來區(qū)別數(shù)據(jù)和噪音,從而恢復(fù)數(shù)據(jù)。

b、TX:發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器被禁止時(shí),輸出引腳恢復(fù)到它的I/O端口配置。當(dāng)發(fā)送器被激活,并且沒東西發(fā)送時(shí),TX引腳處于高電平。

>_

a、USART設(shè)置,這個(gè)要看固件庫!首先用結(jié)構(gòu)體把參數(shù)配置好,然后調(diào)用初始化函數(shù);接著使能接收中斷和發(fā)送緩沖中斷;最后使能USART1。

1 void USART_Config(USART_TypeDef* USARTx){

2 USART_InitStructure.USART_BaudRate = 19200; //速率19200bps

3 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //數(shù)據(jù)位8位

4 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位

5 USART_InitStructure.USART_Parity = USART_Parity_No; //無校驗(yàn)位

6 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件流控

7 USART_InitStructure.USART_Mode = USART_Mode_Rx " USART_Mode_Tx; //收發(fā)模式

8 /* Configure USART1 */

9 USART_Init(USARTx, &USART_InitStructure); //配置串口參數(shù)函數(shù)

10 /* Enable USART1 Receive and Transmit interrupts */

11 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷

12 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能發(fā)送緩沖空中斷

13 /* Enable the USART1 */

14 USART_Cmd(USART1, ENABLE);

15 }


b、配置系統(tǒng)時(shí)鐘72MHz+外設(shè)時(shí)鐘使能。注意這里有復(fù)用,所以要使能復(fù)用時(shí)鐘。


1 void RCC_Configuration(void){

2 SystemInit();

3 RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO , ENABLE);

4 }

c、 LED的GPIO口配置和復(fù)用的A9,A10用于數(shù)據(jù)收發(fā)



1 void GPIO_Configuration(void){

2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1控制--PB5

3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出

4 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

5 GPIO_Init(GPIOB, &GPIO_InitStructure);

6

7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX

8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出

9 GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口

10

11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX

12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //復(fù)用開漏輸入

13 GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口

14 }


d、中斷向量初始化,看固件庫!



1 void NVIC_Configuration(void){

2 /* 結(jié)構(gòu)聲明*/

3 NVIC_InitTypeDef NVIC_InitStructure;

4

5 /* Configure the NVIC Preemption Priority Bits */

6 /* Configure one bit for preemption priority */

7 /* 優(yōu)先級(jí)組 說明了搶占優(yōu)先級(jí)所用的位數(shù),和子優(yōu)先級(jí)所用的位數(shù) 在這里是1, 7 */

8 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

9 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //設(shè)置串口1中斷

10 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優(yōu)先級(jí) 0

11 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子優(yōu)先級(jí)為0

12 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能

13 NVIC_Init(&NVIC_InitStructure);

14 }


e、Main函數(shù):rec_f為有效幀標(biāo)志位


1 int main(void){

2 uint8_t a=0;//LED高低電壓控制

3 RCC_Configuration(); //系統(tǒng)時(shí)鐘設(shè)置

4 NVIC_Configuration(); //中斷源配置

5 GPIO_Configuration(); //端口初始化

6 USART_Config(USART1); //串口1初始化

7

8 while (1){

9 if(rec_f==1){ //判斷是否收到一幀有效數(shù)據(jù)

10 rec_f=0;

11 for(i=0;i

12 {

13 USART_SendChar(USART1,TxBuffer1[i]);

14 Delay(0x0000ff00);

15 }

16 if(a==0){GPIO_SetBits(GPIOB, GPIO_Pin_5);a=1;} //LED1 明暗閃爍

17 else{GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;}

18 }

19 }

20 }


這里發(fā)送函數(shù)封裝為:


1 void USART_SendChar(USART_TypeDef* USARTx,uint8_t data){

2 USART_SendData(USARTx,data);

3 while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);

4 }

接收函數(shù)在中斷函數(shù)中,當(dāng)上位機(jī)發(fā)送數(shù)據(jù)給單片機(jī)時(shí),單片機(jī)將進(jìn)入該中斷服務(wù)程序,進(jìn)行數(shù)據(jù)接收,這里上位機(jī)發(fā)送的數(shù)據(jù)必須以0x0d和0x0a結(jié)尾,如果不是以這兩個(gè)結(jié)尾說明不是有效幀,則不處理:



1 void USART1_IRQHandler(void) //串口1 中斷服務(wù)程序

2 {

3 unsigned int i;

4 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判斷讀寄存器是否非空

5 {

6 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); //將讀寄存器的數(shù)據(jù)緩存到接收緩沖區(qū)里

7 if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1-1]==0x0a)//判斷結(jié)束標(biāo)志是否是0x0d 0x0a

8 {

9 for(i=0; i< RxCounter1; i++) TxBuffer1[i] = RxBuffer1[i]; //將接收緩沖器的數(shù)據(jù)轉(zhuǎn)到發(fā)送緩沖區(qū),準(zhǔn)備轉(zhuǎn)發(fā)

10 rec_f=1; //接收成功標(biāo)志

11 TxBuffer1[RxCounter1]=0; //發(fā)送緩沖區(qū)結(jié)束符

12 TxCounter1=RxCounter1;

13 RxCounter1=0;

14 }

15 }

16 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //這段是為了避免STM32 USART 第一個(gè)字節(jié)發(fā)不出去的BUG

17 {

18 USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止發(fā)緩沖器空中斷,

19 }

20 }


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

  UART   UART是一種通用串行數(shù)據(jù)總線,用于異步通信。該總線雙向通信,可以實(shí)現(xiàn)全雙工傳輸和接收。在嵌入式設(shè)計(jì)中,UART用于主機(jī)與輔助設(shè)備通信,如汽車音響與外接AP之間的通信,

關(guān)鍵字: uart usart

void InitUart(void) { GPIO_InitTypeDef GPIO_InitStructure; #if 1// (USART_USED == USART1) RCC_AHBPeriph...

關(guān)鍵字: stm32f30x usart 串口 初始化順序

五、ATMEGA16的USART與PC機(jī)串行通信五—(02)、PC機(jī)發(fā)送字符給單片機(jī),然后用液晶顯示發(fā)送的字符~~~這章節(jié)也是相對(duì)挺簡單的~~直接上圖片吧~~基本上就這么點(diǎn)吧~~然后就是程序了,這里我只是粘貼一下重要的程...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

終于,我忍不住想吐槽一下翻譯STM 32函數(shù)庫手冊(cè)的同學(xué)了,中間省略了好多東西而且是很重要的東西。。。。。。我的內(nèi)心幾乎是奔潰的?。?!現(xiàn)在就來仔細(xì)說說關(guān)于STM 32 函數(shù)庫3.5 中關(guān)于USART串口通信的坑:在一些教...

關(guān)鍵字: STM32 usart

五、ATMEGA16的USART與PC機(jī)串行通信五—(03)、PC機(jī)發(fā)送控制指令控制單片機(jī)工作~(這個(gè)控制還是比較簡單的~~,不過個(gè)人認(rèn)為還是有水平的~)還是先上圖片~~,然后程序,程序師模塊化的,我盡量貼全點(diǎn)~~然后就...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

一、簡單demo通過232串口,與上位機(jī)進(jìn)行通信。首先保證單片機(jī)232串口與電腦的串口接口相連,當(dāng)然電腦是USB接口,其實(shí)USB接口的實(shí)質(zhì)也是串口。我們實(shí)現(xiàn)上位機(jī)發(fā)送一個(gè)16進(jìn)制的數(shù)據(jù),單片機(jī)接受到數(shù)據(jù)后顯示,并且2倍發(fā)

關(guān)鍵字: STM32 usart 串口通信

#include "stm32f10x_lib.h"#include"stdio.h"#define USART1_DR_Base0x40013804#define SENDBUF...

關(guān)鍵字: STM32 usart

Xmega128的串口非常強(qiáng)大,最多能支持8個(gè)串口。串口又有四種模式:1、異步2、同步3、IRDA紅外模式4、SPI主模式今天我們就使用CVAVR代碼向?qū)珊唵未跍y試程序,實(shí)現(xiàn)每1s打印“HELLO WORLD”字符...

關(guān)鍵字: usart xmega128 串口

//------------------------------------------------------------------------------//ATMEGA16與PC機(jī)的通信實(shí)驗(yàn)1//PC機(jī)發(fā)送一個(gè)字...

關(guān)鍵字: atmega16 avr單片機(jī) usart 串行通信

前言串口對(duì)于處理器來說算是一種標(biāo)配,也是在軟件開發(fā)中必不可少的,那就是使用串口來調(diào)試信息(打印出相應(yīng)的信息)。STM32F0系列的芯片,串口根據(jù)型號(hào)不同,數(shù)量也不同,從1個(gè)到8個(gè)不等。今天主要總結(jié)串口簡單且常用

關(guān)鍵字: stm32f0xx usart 收發(fā)配置
關(guān)閉