你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
小白---------串口通信(寄存器)
[复制链接]
在路上11111111
发布时间:2016-12-4 15:00
文章
文章封面:
-
文章简介:
-
#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;
#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 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)/(9600*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;
}
int main(void)
{
RCC_Init();
LED_Init();
USART_Init();
while(1)
{
USART1->DR = 0X41;//A
LEDON;
Delay(0xFFFFFF);
LEDOFF;
Delay(0xFFFFFF);
}
}
复制代码
赞
0
收藏
1
评论
4
分享
发布时间:2016-12-4 15:00
举报
请先
登录
后回复
4个回答
peter001
回答时间:2016-12-4 16:51:47
a1024a.1 32b0c
支持一下
赞
评论
回复
支持
反对
andypanfan
回答时间:2016-12-4 16:58:11
a0a.1 32b0c
谢谢分享 支持一下!!!!
赞
评论
回复
支持
反对
yhyeefocus
回答时间:2016-12-4 17:39:43
a0a.1 32b0c
寄存器版的串口通信,学习了
赞
评论
回复
支持
反对
jackten
回答时间:2016-12-4 20:23:48
a0a.1 32b0c
谢谢分享
赞
评论
回复
支持
反对
所属标签
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表