STM32 串行通信 USART 程序例舉
1、串行通信 軟件仿真STM32通過串口USART1發(fā)送26個(gè)英文字母(配置寄存器)
/**************************************************************************************************
*硬件平臺(tái):STM32F103VC
*學(xué)習(xí)重點(diǎn):GPIOx的位綁定
*實(shí)現(xiàn)功能:軟件仿真,實(shí)現(xiàn)STM32通過USART1發(fā)送數(shù)據(jù)
*配置寄存器實(shí)現(xiàn)(其中打開系統(tǒng)時(shí)鐘和GPIO引腳的配置是通過庫(kù)函數(shù)實(shí)現(xiàn)的,后面會(huì)具體講解)
**************************************************************************************************/
/*=============================================================================
*位綁定公式:
*1、SRAM區(qū)域:0X22000000----0X200FFFFF
*Aliasaddr=0X22000000+(A-0X20000000)*32+n*4
*2、片上外設(shè)區(qū)域:0X42000000----0X400FFFFF
*Aliasaddr=0X42000000+(A-0X40000000)*32+n*4
*參數(shù)解釋:
*Aliasaddr:設(shè)置“端口GPIOx的第n位”的寄存器_相應(yīng)位的實(shí)際地址
*A:端口GPIOx的基地址(GPIOx_BASE)+相應(yīng)寄存器的偏移地址
*n:配置的是相應(yīng)寄存器的第n位
*寄存器的偏移地址:CRLCRHIDRODRBSRRBRRLCKR
*00H04H08H0CH10H14H18H
=============================================================================*/
/*Includes------------------------------------------------------------------*/
#include"stm32f10x_lib.h"http://包含了所有的頭文件它是唯一一個(gè)用戶需要包括在自己應(yīng)用中的文件,起到應(yīng)用和庫(kù)之間界面的作用。
#include"stm32f10x_map.h"
/******************************快速位綁定**********************************************************/
/*----------------1、宏定義要操作的寄存器地址---------------------------------------------*/
#defineGPIOA_ODR(GPIOA_BASE+0X0C)
#defineGPIOA_IDR(GPIOA_BASE+0X08)
#defineGPIOB_ODR(GPIOB_BASE+0X0C)
#defineGPIOB_IDR(GPIOB_BASE+0X08)
#defineGPIOC_ODR(GPIOC_BASE+0X0C)
#defineGPIOC_IDR(GPIOC_BASE+0X08)
#defineGPIOD_ODR(GPIOD_BASE+0X0C)
#defineGPIOD_IDR(GPIOD_BASE+0X08)
#defineGPIOE_ODR(GPIOE_BASE+0X0C)
#defineGPIOE_IDR(GPIOE_BASE+0X08)
/*----------------2、獲取端口GPIOx(A-E)的對(duì)應(yīng)寄存器的某一操作位的位地址-------------------*/
//#defineBitBand(Addr,BitNum)*((volatileunsignedlong*)(Addr&0xf0000000)+0x2000000+((Addr&0xfffff)*32)+(BitNum*4))
//因?yàn)樽笠?、右移語句的執(zhí)行速度比乘除法語句的運(yùn)動(dòng)速度快,所以將上述語句改成如下方式
#defineBitBand(Addr,BitNum)*((volatileunsignedlong*)((Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))
/*----------------3、宏定義函數(shù),對(duì)固定的位綁定進(jìn)行功能封裝------------------------------*/
#definePAout(n)BitBand(GPIOA_ODR,n)
#definePAin(n)BitBand(GPIOA_IDR,n)
#definePBout(n)BitBand(GPIOB_ODR,n)
#definePBin(n)BitBand(GPIOB_IDR,n)
#definePCout(n)BitBand(GPIOC_ODR,n)
#definePCin(n)BitBand(GPIOC_IDR,n)
#definePDout(n)BitBand(GPIOD_ODR,n)
#definePDin(n)BitBand(GPIOD_IDR,n)
#definePEout(n)BitBand(GPIOE_ODR,n)
#definePEin(n)BitBand(GPIOE_IDR,n)
/*----------------函數(shù)聲明部分---------------*/
voiddelay1ms(intt);
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
/*Privatefunctions-----------------------------------------------------------------------------*/
/**************************************************************************************************
*FunctionName:main
*Description:從GPIOA.8-.16輸入一個(gè)電平信號(hào),GPIOA.0-.7口分別將對(duì)應(yīng)引腳輸入的電平信號(hào)輸出
*Input:None
*Output:None
*Return:None
****************************************************************************************************/
intmain(void)
{
floatDiv;//計(jì)算波特率時(shí)公式里面的除數(shù)
u16M,F;//臨時(shí)存儲(chǔ)Div的整數(shù)部分的數(shù)字和小數(shù)部分的數(shù)字
u32Bound,BRR;//Bound:要設(shè)置的波特率,BRR:是Div的整數(shù)部分和小數(shù)部分整合后存入寄存器USART1->BRR中的值
u8data='A';//存放要發(fā)送的數(shù)據(jù)
RCC_Configuration();//配置開啟系統(tǒng)時(shí)鐘
GPIO_Configuration();//配置IO口
/*--------USART1模塊的設(shè)置:UE位使能、M位來定義字長(zhǎng)、停止位的位數(shù)、TE位、BRR寄存器選擇要求的波特率----------------*/
USART1->CR1|=(1<<13);//位于寄存器CR1的第13位。UE=1;對(duì)USART1進(jìn)行使能。(=0時(shí),分頻器和輸出被禁止)
USART1->CR1&=~(1<<12);//位于寄存器CR1的第12位。M=0;無奇偶校驗(yàn)位,起始位+8位數(shù)據(jù)+停止位(=1時(shí),帶一位奇偶校驗(yàn)位)
USART1->CR2&=~(3<<12);//位于寄存器CR2的第13-12位。STOP=00;1位停止位。(=01;0.5位。=10;2位。=11;1.5位)
USART1->CR1|=(1<<3);//位于寄存器CR1的第3位。USART1的發(fā)送使能位。TE=1;發(fā)送使能(=0時(shí),禁止發(fā)送)
Bound=9600;//設(shè)置波特率
Div=(float)(72*1000*1000)/(Bound*16);//乘以16是因?yàn)樵撔酒?6位的。(寄存器也是16位的)
M=Div;
F=(Div-M)*16;
BRR=M<<4|F;
USART1->BRR=BRR;
/*--------發(fā)送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/
for(F=0;F<26;F++)
{
USART1->DR=data;
data++;
while((USART1->SR&(1<<6))==0);
}
}
/*******************************************************************************
*FunctionName:Delay_Ms
*Description:delay1ms.
*Input:dly(ms)
* Output