- /*******************************************************/
- /************PA^9是TX(推免输出),PA^10是RX(浮空输入)*****/
-
- #define __IO volatile
- typedef unsigned int uint32_t;
- typedef unsigned short int uint16_t;
- typedef unsigned char u8_t;
- typedef __IO uint32_t vu32;
- typedef __IO uint16_t vu16;
- typedef uint16_t u16;
- typedef __IO uint32_t vu32;
- typedef u8_t uint8_t;
- #define CMD_STRING_SIZE 128
- #define GPIO_Pin_0 ((uint16_t) 0x0001)
- #define GPIO_Pin_1 ((uint16_t) 0x0002)
- #define GPIO_Pin_2 ((uint16_t) 0x0004)
- #define GPIO_Pin_3 ((uint16_t) 0x0008)
- #define GPIO_Pin_4 ((uint16_t) 0x0010)
- #define GPIO_Pin_5 ((uint16_t) 0x0020)
- #define GPIO_Pin_6 ((uint16_t) 0x0040)
- #define GPIO_Pin_7 ((uint16_t) 0x0080)
- #define GPIO_Pin_8 ((uint16_t) 0x0100)
- #define GPIO_Pin_9 ((uint16_t) 0x0200)
- #define GPIO_Pin_10 ((uint16_t) 0x0400)
- #define GPIO_Pin_11 ((uint16_t) 0x0800)
- #define GPIO_Pin_12 ((uint16_t) 0x1000)
- #define GPIO_Pin_13 ((uint16_t) 0x2000)
- #define GPIO_Pin_14 ((uint16_t) 0x4000)
- #define GPIO_Pin_15 ((uint16_t) 0x8000)
- #define GPIO_Pin_All ((uint16_t) 0xFFFF)
- /***********GPIOD***********/
- typedef struct
- {
- __IO uint32_t CRL;
- __IO uint32_t CRH;
- __IO uint32_t IDR;
- __IO uint32_t ODR;
- __IO uint32_t BSRR;
- __IO uint32_t BRR;
- __IO uint32_t LCKR;
- }GPIO_TypeDef;
- typedef struct
- {
- __IO uint32_t ACR;
- }FLASH_INTERFACE;
- /*********************GPIOA管脚的内存对应地址**********/
- #define PERIPH_BASE ((uint32_t) 0x40000000)
- #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
- #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
- #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
- /**************GPIOD管脚的内存对应地址**********/
- #define PERIPH_BASE ((uint32_t) 0x40000000)
- #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
- #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
- #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
- #define FLASH_BASE ((uint32_t) 0x40022000)
- #define FLASH ((FLASH_INTERFACE *) FLASH_BASE)
- #define RCC_APB2Periph_AFIO ((uint32_t) 0x000000001)
- #define RCC_APB2Periph_GPIOA ((uint32_t) 0x000000004)
- #define RCC_APB2Periph_GPIOB ((uint32_t) 0x000000008)
- #define RCC_APB2Periph_GPIOC ((uint32_t) 0x000000010)
- #define RCC_APB2Periph_GPIOD ((uint32_t) 0x000000020)
- typedef enum {RESET = 0,SET = !RESET } FlagStatus, ITStatus;
- #define USRAT_FLAG_CTS ((uint16_t) 0x0200)
- #define USART_FLAG_LBD ((uint16_t) 0x0100)
- #define USART_FLAG_TXE ((uint16_t) 0x0080)
- #define USART_FLAG_TC ((uint16_t) 0x0040)
- #define USART_FLAG_RXNE ((uint16_t) 0x0020)
- #define USART_FLAG_IDLE ((uint16_t) 0x0010)
- #define USART_FLAG_ORE ((uint16_t) 0x0008)
- #define USART_FLAG_NE ((uint16_t) 0x0004)
- #define USART_FLAG_FE ((uint16_t) 0x0002)
- #define USART_FLAG_PE ((uint16_t) 0x0001)
- typedef struct
- {
- __IO uint32_t CR;
- __IO uint32_t CFGR;
- __IO uint32_t CIR;
- __IO uint32_t APB2RSTR;
- __IO uint32_t APB1RSTR;
- __IO uint32_t AHBENR;
- __IO uint32_t APB2ENR;
- __IO uint32_t APB1ENR;
- __IO uint32_t BDCR;
- __IO uint32_t CSR;
- __IO uint32_t AHBRSTR;
- __IO uint32_t CFGR2;
- }RCC_TypeDef;
- /******************RCC时钟**********/
- #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
- #define RCC_BASE (AHBPERIPH_BASE + 0x1000)
- #define RCC ((RCC_TypeDef *)RCC_BASE)
- void RCC_Init()//72
- {
- unsigned char sws = 0;
- RCC->CR |= 0x00010000;
- while(!(RCC->CR>>17));
- RCC->CFGR2 |= 4<<4;
- RCC->CFGR2 |= 6<<8;
- RCC->CFGR2 |= 1<<16;
- RCC->CR |= 1<<26;
- while(!(RCC->CR>>27));
- RCC->CFGR2 |= 0x00000004;
- RCC->CFGR |= 1<<16;
- RCC->CFGR |= 7<<18;
- RCC->CFGR |= 1<<16;
- RCC->CR |= 1<<24;
- FLASH->ACR |= 0x32;
- while(!(RCC->CR>>25));
- RCC->CFGR |= 1<<1;
- while(sws != 0x2)
- {
- sws = RCC->CFGR>>2;
-
- sws &= 0x3;
- }
- }
- #define LEDON (GPIOD->BRR |= GPIO_Pin_2)
- #define LEDOFF (GPIOD->BSRR |= GPIO_Pin_2)
- void LED_Init()
- {
- RCC->APB2ENR |= RCC_APB2Periph_GPIOD;
- GPIOD->CRL &= 0xFFFFF0FF;
- GPIOD->CRL |= 0x00000300;
- GPIOD->BSRR |= GPIO_Pin_2;
- }
- void Delay(vu32 nCount)
- {
- for(;nCount != 0;nCount--);
- }
- typedef struct
- {
- vu16 SR;
- u16 RESERVED0;
- vu16 DR;
- u16 RESERVED1;
- vu16 BRR;
- u16 RESERVED2;
- vu16 CR1;
- u16 RESERVED3;
- vu16 CR2;
- u16 RESERVED4;
- vu16 CR3;
- u16 RESERVED5;
- vu16 GTPR;
- u16 RESERVED6;
- }USART_TypeDef;
- /*********************USART1的内存对应地址******/
- //#define PERIPH_BASE ((uint32_t)0x40000000)
- #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
- #define USART1_BASE (APB2PERIPH_BASE + 0x3800)
- #define USART1 ((USART_TypeDef *)USART1_BASE)
- /**************串口配置步骤**********/
- /******
- 1:打开GPIOA的时钟(这个是因为中断的TX和RX的引脚分别PA^9和PA^10;
- 2:打开串口中断的时钟;
- 3:配置TX和RX的模式
- 在这里,我试过RX的输入模式可以是浮空输入模式,也可以是模拟输入模式
- 还可以是上/下拉模式,
- 4:设置波特率;
- 5:设置校验模式:(注意,在这里我试过偶校验模式,但是没弄出来,希望大家可以试试,
- 如果大家谁试过奇偶校验的话,可以发个帖来分享下(谢谢咯))
- 我用的是无校验模式。
- ****/
- void USART_Init()
- {
- float USARTDIV;
- u16 USARTDIV_zhengshu;
- u16 USARTDIV_xiaoshu;
- RCC->APB2ENR |= 1<<2;//GPIOA的时钟打开
- RCC->APB2ENR |= 1<<14;//打开串口的时钟
- GPIOA->CRH &= 0XFFFFF00F;//
- GPIOA->CRH |= 0X000008B0;//TX是推挽输出模式,RX是浮空输入(上下拉,模拟输入都可以)模式
- USARTDIV = (float)(72*1000000)/(115200*16);//这是波特率的数值
- USARTDIV_zhengshu = USARTDIV;//取整数部分
- USARTDIV_xiaoshu = (USARTDIV-USARTDIV_zhengshu)*16;//取小数部分,
- /************0.0625变成整数的部分
- 0.0625,第二个0是2^-1,6是2^-2;2是2^-3;5是2^-4;
- 步骤是0.0625*2=0.125;整数部分是0;
- 0.125*2=0.25; 整数部分是0;
- 0.25*2=0.5; 整数部分是0;
- 0.5*2=1; 整数部分是1;
- 所以排序是0001;代表的是整数1;
- 这里最大的0.99*2=1.98;整数部分是1;
- 0.98*2=1.96;整数部分是1;
- 0.96*2=1.92;整数部分是1;
- 0.92*2=1.84;整数部分是1;
- 因为只有前四位是小数部分所以最大为F;
- 所以这里只需*16取整数部分即可;
- **********************/
- USARTDIV_zhengshu <<=4;//因为前四位是小数部分,所以需要左移4位;
- USARTDIV_zhengshu += USARTDIV_xiaoshu;//这个就是波特的设定值了;
- /***********当CPU刚开启动的时候都需要重新启动一下外设装置,确保外设装置能够在
- 正常供电后,稳定工作。
- 可以看到复位一次后就可以了,然后停止复位,让其正常的工作。******/
- RCC->APB2RSTR |= 1<<14;//
- RCC->APB2RSTR &= ~(1<<14);
- USART1->BRR = USARTDIV_zhengshu;
- USART1->CR1 |= 0X200C;
- }
- FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx,uint16_t USART_FLAG)
- {
- FlagStatus bitstatus = RESET;
- if((USARTx->SR & USART_FLAG)!= (uint16_t)RESET)
- {
- bitstatus = SET;
- }
- else
- {
- bitstatus = RESET;
- }
- return bitstatus;
- }
- void USART_ClearFlag(USART_TypeDef *USARTx,uint16_t USART_FLAG)
- {
- USARTx->SR = (uint16_t)~USART_FLAG;
- }
- void USART_SendData(USART_TypeDef* USARTx,char data)
- {
- USARTx->DR = (data&(uint16_t)0X01FF);//实际上发送的数据的ASCI码的范围时0--127
- while(USARTx->SR&0x40==0);//等待那个TC位(数据发送完成位)置1
- }
- void USART1_Printf(char *data)
- {
- while(*data!='\0')
- {
- USART_SendData(USART1,*data);
- while((USART1->SR&(uint16_t)0x80)==0);
- /*TXE:发送数据寄存器空 (Transmit data register empty) 位7
- 当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USART_CR1
- 寄存器中的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。
- 0:数据还没有被转移到移位寄存器;
- 1:数据已经被转移到移位寄存器。
- 注意:单缓冲器传输中使用该位******/
- //USART1->SR &= ((uint16_t)0XFF7F);//清除数据位(清除TX位,有的时候还需要清除TC位,如果是TC和TXE位的
- USART_ClearFlag(USART1,USART_FLAG_TXE); //时候是USART1->SR &= ((uint16_t)0xFF3F;
- data++;
- }
- }
- uint32_t SerialKeyPressed(uint8_t *key)
- {
- if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)
- {
- *key = (uint8_t)USART1->DR;
- return 1;
- }
- else
- return 0;
- }
- uint8_t GetKey(void)
- {
- uint8_t key = 0;
- while(1)
- {
- if(SerialKeyPressed((uint8_t*)&key))
- break;
- }
- return key;
- }
- void SerialPutChar(uint16_t c)
- {
- USART_SendData(USART1,c);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == 0)
- {
- }//判断TXE是否被置1
- }
- void GetInputString(uint8_t *buffP)
- {
- uint32_t bytes_read = 0;
- uint8_t c = 0;
- do
- {
- c = GetKey();
- if(c=='r')
- break;
- if(c == 'b')
- {
- if(bytes_read>0)
- {
- USART1_Printf("\b \b");
- bytes_read--;
- }
- continue;
- }
- if(bytes_read >= (CMD_STRING_SIZE))
- {
- USART1_Printf("Command string size overflow\r\n");//如果发送的数据
- //超过了128位的话就会报错
- bytes_read = 0;//记录数据的标志变为0
- continue;
- }
- if(c>=0x20&&c<=0x7E)
- {
- buffP[bytes_read++] = c;
- SerialPutChar(c);//输出数据
- }
- }while(1);
- USART1_Printf(("\n\r"));//换行
- buffP[bytes_read] = '\0';//加上结束标志
- }
- int main(void)
- {
- uint8_t inputstr[CMD_STRING_SIZE];
- RCC_Init();
- LED_Init();
- USART_Init();
- if(0x0020==(USART1->SR&0x0020))
- {
- USART1->SR&= 0XFFDF;//这个是清除RXEN的
- USART_SendData(USART1,USART1->DR);
- while((USART1->SR&(uint16_t)0x80)==0);
- USART1->SR &= ((uint16_t)0XFF7F);//清除数据位
- USART_SendData(USART1,'\r');//换行
- while((USART1->SR&(uint16_t)0x80)==0);
- USART1->SR &= ((uint16_t)0XFF7F);
- USART_SendData(USART1,'\n');
- while((USART1->SR&(uint16_t)0x80)==0);
- USART1->SR &= ((uint16_t)0XFF7F);
- }
复制代码
|