中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

運營服務商官方網(wǎng)站百度首頁純凈版怎么設置

運營服務商官方網(wǎng)站,百度首頁純凈版怎么設置,制作網(wǎng)站品牌公司,鼎成中考開卷通有關網(wǎng)站做的電子書前言: 串口是很重要的,有許多模塊通信接口就是串口,例如gps模塊,藍牙模塊,wifi模塊還有一些精度比較高的陀螺儀模塊等等,所以學會了串口之后,這些聽起來很牛批的模塊都能夠用起來了。此外&#…

前言:

? ? ? ? 串口是很重要的,有許多模塊通信接口就是串口,例如gps模塊,藍牙模塊,wifi模塊還有一些精度比較高的陀螺儀模塊等等,所以學會了串口之后,這些聽起來很牛批的模塊都能夠用起來了。此外,單片機的之間的通信,也大多用串口,如距離比較長的RS485,RS232,光纖通信等等有線通信,也只是電平轉(zhuǎn)換芯片不一樣,但是代碼層面完成是一樣的,作為單片機開發(fā)串口是很必要熟練的。在學習的第二階段,盡量還是照著手冊來編寫代碼,或者說,根據(jù)自己的思路來嫖代碼,而不是像初次學習一樣代碼、思路都嫖別人的。這樣才能最大限度的檢驗自己的能力,當然,做項目怎樣都成,怎么方便怎么來。

思路:

? ? ? ?下面就來記錄記錄我個人的編碼思路,首先由下圖可以看到,串口的模式還是挺多的:

????????這樣相應的寄存器也就必然很多,所以從一開始就需要明確我們需要的是哪種模式,然后就只關注這個模式,與之無關的寄存器都可以忽略,如此編碼就簡單清晰了。以最常用的異步模式為例:

????????手冊沒有講初始化流程,所以只能按照經(jīng)驗來寫代碼了,回憶串口無非就是:串口時鐘使能,配置數(shù)據(jù)位,停止位等,配置波特率,使能串口,從寄存器讀出數(shù)據(jù)/向寄存器寫入數(shù)據(jù)。一般為了方便數(shù)據(jù)處理,還加一個接收中斷。但是~串口不只是串口,還涉及GPIO初始化,GPIO復用配置。

1.初始化GPIO相關配置

三部曲:時鐘,IO,復用啥

????????GPIOx->AFR這個寄存器就是將某個GPIO管腳復用成指定功能的。下面AF雖多,但是要根據(jù)數(shù)據(jù)手冊引腳說明來選,芯片沒有設計的當然選了也沒用。我沒有在手冊找到AF對應的是什么,不過正點原子的代碼有寫,也不知哪里找的。

//AF0~15設置情況(這里僅是列出常用的,詳細的請見407數(shù)據(jù)手冊,56頁Table 7):
//AF0:MCO/SWD/SWCLK/RTC   AF1:TIM1/TIM2;            AF2:TIM3~5;               AF3:TIM8~11
//AF4:I2C1~I2C3;          AF5:SPI1/SPI2;            AF6:SPI3;                 AF7:USART1~3;
//AF8:USART4~6;           AF9;CAN1/CAN2/TIM12~14    AF10:USB_OTG/USB_HS       AF11:ETH
//AF12:FSMC/SDIO/OTG/HS   AF13:DCIM                 AF14:                     AF15:EVENTOUT

?編碼如下:

1.時鐘
RCC->AHB1ENR|=1<<0;   	//GPIOA時鐘附屬于AHB1
2.IO  
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,0,0,0);//PA9,PA10,都配置為復用模式,其他電氣屬性如上下拉之類的可以根據(jù)需要配置,不配置也行的。
3.復用啥,直接用正點原子的函數(shù),里面其實就是對GPIOx->AFRH和GPIOx->AFRL這兩個寄存器進行編寫,不過正點原子這個封裝的挺好的,一目了然
GPIO_AF_Set(GPIOA,9,7);	//PA9,AF7
GPIO_AF_Set(GPIOA,10,7);//PA10,AF7  	   

2.串口相關初始化

目的是:串口時鐘使能,配置數(shù)據(jù)位,停止位,接收中斷,使能串口等,配置波特率,從寄存器讀出數(shù)據(jù)/向寄存器寫入數(shù)據(jù)。

由手冊第66頁可知,USART1時鐘隸屬于APB2

1.使能串口1時鐘?? ?

?RCC->APB2ENR|=1<<4; ??

2.配置波特率:

根據(jù)公式算,然后填到對應的位里面去

	float temp;u16 mantissa;    //整數(shù)部分u16 fraction;	 //小數(shù)部分temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0mantissa=temp;				 //得到整數(shù)部分fraction=(temp-mantissa)*16; //得到小數(shù)部分@OVER8=0 mantissa<<=4;mantissa+=fraction; USART1->BRR=mantissa; 	//波特率設置	 

這個是正點原子那嫖的,適用于多種時鐘,多種波特率的情況,挺好用的。

3.配置數(shù)據(jù)位,停止位,中斷等

USART_CR1檢索:只看和異步通信有關的位,其他的不管

bit[2]:? ? ? ? 接收使能

bit[3]:? ? ? ? 發(fā)送使能

bit[5]:? ? ? ? 接收中斷使能

bit[10]:? ? ? ?關/開奇偶檢驗

bit[12]:? ? ? ?置零:1 起始位,8 數(shù)據(jù)位,n 停止位

bit[13]:? ? ? ? 串口關閉/使能,后面記得給這個串口中斷分組以及設置優(yōu)先級

bit[15]:? ? ? ? 0:16倍過采樣率,1:8倍過采樣率,這個是和波特率計算有關的,設為0

其他就無所謂了,好像這個寄存器就完全夠配置我們所需了

USART1->CR1 = 0<<15 | 1<<13 | 0<<12 | 0<<10 | 1<<5 | 1<<3 | 1<<2 ;
//中斷分組及優(yōu)先級,中斷后面有時間再講(其核心思想就是分組,中斷線,設優(yōu)先級三部曲)
MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優(yōu)先級 

4.完整的串口初始化代碼如下:

void uart_init(u32 pclk2,u32 bound)
{ float temp;u16 mantissa;u16 fraction;	   //1.GPIO初始化相關RCC->AHB1ENR|=1<<0;   	//使能PORTA口時鐘  GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,0,0,0);//PA9,PA10,復用功能GPIO_AF_Set(GPIOA,9,7);	//PA9,AF7GPIO_AF_Set(GPIOA,10,7);//PA10,AF7  //2.使能串口1時鐘 RCC->APB2ENR|=1<<4;  	//3.波特率設置temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0mantissa=temp;				 //得到整數(shù)部分fraction=(temp-mantissa)*16; //得到小數(shù)部分@OVER8=0 mantissa<<=4;mantissa+=fraction; USART1->BRR=mantissa; 	//波特率設置	 //4.配置數(shù)據(jù)位,停止位,中斷等USART1->CR1 = 0<<15 | 1<<13 | 0<<12 | 0<<10 | 1<<5 | 1<<3 | 1<<2 ;//中斷分組及優(yōu)先級,中斷后面有時間再講(其核心思想就是分組,中斷線,設優(yōu)先級三部曲)MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優(yōu)先級 
}

運行效果:

其他代碼不改動,換上自己思路寫的代碼運行ok:

3.中斷服務函數(shù)

a.它最原始的模樣:
void USART1_IRQHandler(void)
{u8 res;	if(USART1->SR&(1<<5))//接收到數(shù)據(jù)的標志置1---->>有數(shù)據(jù){	 res=USART1->DR; //取出接收到的數(shù)據(jù)---->>1B} } 

如果要發(fā)送數(shù)據(jù),可以編寫如下:

u8 res;
USART1->DR = res;//要發(fā)送的數(shù)據(jù)  1B
while((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束
b.正點原子給的:
u8 USART_RX_BUF[USART_REC_LEN];     //里面存著接收到的數(shù)據(jù)u16 USART_RX_STA=0;                 //是否有數(shù)據(jù)標志+接收到的字節(jié)數(shù)//下面這個不用改它,原封不動放代碼里就能用
void USART1_IRQHandler(void)
{u8 res;	if(USART1->SR&(1<<5))//接收到數(shù)據(jù){	 res=USART1->DR; if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始else USART_RX_STA|=0x8000;	//接收完成了 }else //還沒收到0X0D{	if(res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=res;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收	  }		 }}  		 									     } } 

其中:

判斷有無數(shù)據(jù)接收:

		if(USART_RX_STA&0x8000){。。。。。。}

得知數(shù)據(jù)共有多少B:

int len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長度

數(shù)據(jù)存放的數(shù)組:

USART_RX_BUF[]

相對來說以及挺方便的了~下面還有一個比賽常用的,自定義的協(xié)議

c.自定義協(xié)議:
首先在usart.c中加入變量:
/*更改變量 BEGIN-- */
uint8_t uart1_rxbuff;//引入該.h可使用
uint8_t uart2_rxbuff;//引入該.h可使用
uint8_t uart3_rxbuff;//引入該.h可使用uint8_t sendBuf[1]; 
u8 uart1_sdbuffer[11]={0x2c,0x12,0x11,0x22,0x33,0x5b,0,0,0,0};//從索引2開始賦值
/*更改變量 END-- */
在usart.h中導出方便別的文件使用:
extern uint8_t uart1_rxbuff;
extern uint8_t uart2_rxbuff;
extern uint8_t uart3_rxbuff;extern uint8_t uart1_sdbuffer[11];
下面是協(xié)議解析函數(shù),自定義的協(xié)議是:

協(xié)議頭0x2c,0x12

協(xié)議尾0x5b,想要讓協(xié)議數(shù)據(jù)位變多,只需要修改變量RxBuffer1[]的定義即可

//解析接收的數(shù)據(jù) 最多11哥,兩個幀頭,一個幀尾,其他是數(shù)據(jù)位
void Portocol_Receive_Data(uint8_t com_data)
{uint8_t i;static uint8_t RxCounter1=0;//計數(shù)static uint8_t RxBuffer1[11]={0};static uint8_t RxState = 0;	static uint8_t RxFlag1 = 0;u8 pi=0;//printf("%x\t",com_data);//打印調(diào)試if(RxState==0&&com_data==0x2C)  //0x2c幀頭 RxCounter1==1{RxState=1;RxBuffer1[RxCounter1++]=com_data;  }else if(RxState==1&&com_data==0x12)  //0x12幀頭 RxCounter1==2{RxState=2;RxBuffer1[RxCounter1++]=com_data;}else if(RxState==2)//開始接收數(shù)據(jù)位{                     RxBuffer1[RxCounter1++]=com_data;if(RxCounter1>=10||com_data == 0x5B){//RxCounter1-1是幀尾if(RxBuffer1[RxCounter1-1] == 0x5B)//接收到貞結(jié)尾了{/* USER CODE BEGIN 2 */
//                    for(i = 0; i <= 10; i++)
//                    {
//                        printf("%x\t",RxBuffer1[i]);
//                    }
//                    printf("\r\n");USART1_Portocol_Send_Data();
//                    printf("\r\n");/* USER CODE END 2 */RxFlag1 = 0;RxCounter1 = 0;RxState = 0;}else   //接收錯誤{RxState = 0;RxCounter1=0;for(i=0;i<11;i++){RxBuffer1[i]=0x00;      //將存放數(shù)據(jù)數(shù)組清零}}}}else   //接收異常{RxState = 0;RxCounter1=0;for(i=0;i<10;i++){RxBuffer1[i]=0x00;      //將存放數(shù)據(jù)數(shù)組清零}}
}
中斷服務函數(shù)是這樣滴:
void USART1_IRQHandler(void)
{if(USART1->SR&(1<<5))//接收到數(shù)據(jù){	uart1_rxbuff = USART1->DR;Portocol_Receive_Data(uart1_rxbuff);}
}
另外還有一個協(xié)議配套的發(fā)送函數(shù):

要修改發(fā)送的內(nèi)容只需修改uart1_sdbuffer數(shù)組的內(nèi)容即可:

//串口X發(fā)送函數(shù)
void USART1_Portocol_Send_Data(void)
{u8 i;for(i = 0; i <= 10; i++){USART1->DR=uart1_sdbuffer[i];//要發(fā)送的數(shù)據(jù)  1Bwhile((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束}
}
效果如下:

在協(xié)議代碼中,下面這部分就是給你自由發(fā)揮的,進到這段代碼里說明成功接收到了按協(xié)議格式發(fā)來的信息;

4.拓展到其他串口:

復用到其他的串口也很簡單,仿照把發(fā)送呀接收呀里面的寄存器改一改就行了

????????比賽常用的還是自定義協(xié)議的串口,比如雙車用藍牙通訊呀,或者stm32和openmv通訊,幾乎都要自己寫一個協(xié)議去收發(fā)數(shù)據(jù),這樣才會可靠。

????????完~

http://www.risenshineclean.com/news/48162.html

相關文章:

  • 成都設計院工資企業(yè)站seo價格
  • 太原網(wǎng)站建設技術(shù)托管鄭州seo哪家好
  • 福建設計院網(wǎng)站百度百度一下就知道
  • 去哪找想做網(wǎng)站的客戶2023年8月疫情嚴重嗎
  • 無錫高端網(wǎng)站建設寧波seo搜索引擎優(yōu)化公司
  • 網(wǎng)站換了域名還被k站不安仁網(wǎng)絡推廣
  • 整站排名優(yōu)化品牌怎么推廣網(wǎng)站鏈接
  • 專業(yè)做淘寶網(wǎng)站公司嗎seo是什么職業(yè)崗位
  • 部署在本地的wordpress太原網(wǎng)站優(yōu)化公司
  • 武昌網(wǎng)站建設推廣手段和渠道有哪些
  • 專業(yè)做網(wǎng)站app的公司有哪些有品質(zhì)的網(wǎng)站推廣公司
  • 如何網(wǎng)站建設seo優(yōu)化排名百度教程
  • 物流三方網(wǎng)站怎么做重慶森林電影
  • 網(wǎng)站數(shù)據(jù)鏈接怎么做商城推廣軟文范文
  • 泉州網(wǎng)站制作平臺谷歌google play下載
  • 如何做網(wǎng)絡營銷直播倉山區(qū)seo引擎優(yōu)化軟件
  • 北京最好的網(wǎng)站建設公司全國疫情高峰感染高峰進度
  • 西寧商城網(wǎng)站建設公司網(wǎng)站關鍵詞優(yōu)化有用嗎
  • 滄州網(wǎng)站備案哈爾濱網(wǎng)絡推廣
  • 如何做電商網(wǎng)站成都seo培
  • 世界杯視頻直播網(wǎng)站房地產(chǎn)十大營銷手段
  • 太原網(wǎng)站制作案例公司網(wǎng)站模版
  • 柯橋做網(wǎng)站的公司百度網(wǎng)盤官網(wǎng)登錄首頁
  • 怎么做網(wǎng)站訪問統(tǒng)計手機創(chuàng)建網(wǎng)站免費注冊
  • 有pc網(wǎng)站 移動網(wǎng)站怎么做關鍵詞怎么找出來
  • 企業(yè)網(wǎng)站建設哪里好推廣鏈接點擊器
  • 鶴壁seo東莞做網(wǎng)站優(yōu)化
  • 網(wǎng)站是誰做的企業(yè)產(chǎn)品網(wǎng)絡推廣
  • java網(wǎng)站開發(fā)計劃表情感營銷案例
  • 廣州部隊網(wǎng)站建設費用拓客團隊怎么聯(lián)系