OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3759|回复: 1

这两段初始化程序有什么不一样?用寄存器设置时

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2014-11-28 11:05:01 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE );//使能GPIOA时钟 RCC_APB1PeriphClockCmd ( RCC_APB1Periph_USART2,ENABLE );//使能USART2时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位 USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_Even;///奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式 USART_Init(USART2, &USART_InitStructure); //初始化串口 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );//开启中断
[mw_shl_code=c,true]/******************************************************************************************************************/[/mw_shl_code] [mw_shl_code=c,true]     float temp;[/mw_shl_code] [mw_shl_code=c,true] u16 mantissa; u16 fraction;   NVIC_InitTypeDef  NVIC_InitStructure;
temp = ( (float)(36*1000000) ) / (bound*16);//得到USARTDIV mantissa = temp; //得到整数部分 fraction = (temp-mantissa)*16; //得到小数部分 mantissa <<= 4; mantissa += fraction; RCC->APB2ENR |= 1<<2; //使能PORTA口时钟 GPIOA->CRL &= 0XFFFF000F; //IO状态设置 GPIOA->CRL |= 0X00008B30; //IO状态设置 RCC->APB1ENR |= 1<<17; //使能串口时钟 RCC->APB1RSTR |= 1<<17; //复位串口2 RCC->APB1RSTR &= ~(1<<17);//停止复位 USART2->BRR = mantissa; // 波特率设置 USART2->CR1 |= 0X340C; //1位停止 USART2->CR1 |= 1<<8; //校验错误中断使能 USART2->CR1 |= 1<<5; //接收缓冲区非空中断使能 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );//开启中断[/mw_shl_code]
USART_Cmd(USART2, ENABLE); //使能串口 [/mw_shl_code]



485发送:PA1控制方向,用寄存器设置时没发现问题,用库函数时板子偶尔卡住,好像接收不到,等一下(一两秒)再发又正常了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-28 23:22:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 13:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表