打印

[b]STM32库中GPIO_Pin_0和GPIO_PinSource0有什么区别[/b]

[复制链接]
7579|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1026869700|  楼主 | 2015-7-7 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1026869700 于 2015-7-8 14:27 编辑

     这几天在测试一个东西,用的是STM32F0的板子,中间要用到串口,于是按照往常一样,建项目,配置串口,测试串口。可是问题出现了,只要是一打开串口,就会出现接收应答中断标志,发送应答中断标志,接收寄存器非空中断标志,帧错误标志。这个问题就纳闷了,用了多少遍的串口,怎么今天就死活不行呢!和同事一起找,找了半天,没有解决。
   第二天上班,继续找,这次改变策略,按照寄存器一个一个找,看是不是哪个寄存器忘记配置了,到最后发现是端口复用寄存器没有写进去啊!可是函数执行了啊,为什么写不进去啊。于是刨根问地的找。原本是这样的:    /*****************************************************                                                                                                                          #define GPIO_Pin_9            ((uint16_t)0x0200)  /*!< Pin 9 selected    */宏定义 GPIO_Pin_9  为512。
GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_1); (此句有错误)
/*****************************************************
GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
函数里面这一句是给寄存器写数据的。可是这一句执行完了之后,寄存器还是没有写进去。然后就找为什么写不进去。
GPIO_PinSource >> 0x03
这一句是把512向右移3位,相当于除8,结果为64.就等于是往AFR[64]里面写数据。可是为什么还是写不进去。继续找GPIOx->AFR[]这个在哪里。
__IO uint32_t AFR[2];       /*!< GPIO alternate function low register,
        最终找到了,这是一个长度为2的数组,那么AFR[64]肯定是错的,可是64是系统计算的,怎么会错呢?那么问题估计出在GPIO_Pin_9这个上面,因为这个的宏定义是512。难道还有别的宏定义?于是就在定义GPIO_Pin_9的地方往下找,果然找到了。

#define GPIO_PinSource9            ((uint8_t)0x09)有这个宏定义的。

/** @defgroup GPIO_Pin_sources
  * @{
  */
#define GPIO_PinSource0            ((uint8_t)0x00)
#define GPIO_PinSource1            ((uint8_t)0x01)
#define GPIO_PinSource2            ((uint8_t)0x02)
#define GPIO_PinSource3            ((uint8_t)0x03)
#define GPIO_PinSource4            ((uint8_t)0x04)
#define GPIO_PinSource5            ((uint8_t)0x05)
#define GPIO_PinSource6            ((uint8_t)0x06)
#define GPIO_PinSource7            ((uint8_t)0x07)
#define GPIO_PinSource8            ((uint8_t)0x08)
#define GPIO_PinSource9            ((uint8_t)0x09)
#define GPIO_PinSource10           ((uint8_t)0x0A)
#define GPIO_PinSource11           ((uint8_t)0x0B)
#define GPIO_PinSource12           ((uint8_t)0x0C)
#define GPIO_PinSource13           ((uint8_t)0x0D)
#define GPIO_PinSource14           ((uint8_t)0x0E)
#define GPIO_PinSource15           ((uint8_t)0x0F)
完整的是这样,最多到15,那么15除8结果最大为1,那么AFR[2]数组肯定不会溢出。于是修改了一下配置信息。果然,复用功能寄存器写进去了。串口的接收数据寄存器非空标志和真错误标志没有了,测试一下。果然通过了,串口正常工作。
    这个问题是自己在写的时候大意,才犯的错误。也警示大家,注意一下,写程序要细心,否则一个大意造成的错误,要浪费掉很多时间。得不偿失。



相关帖子

沙发
1026869700|  楼主 | 2015-7-8 14:21 | 只看该作者
yyy71cj 发表于 2015-7-7 23:01
马虎大意是自己最大的敌人

我是已经不止一次犯大意的错误了

使用特权

评论回复
板凳
1026869700|  楼主 | 2015-7-10 09:36 | 只看该作者
yyy71cj 发表于 2015-7-9 18:03
犯错是不犯错之母

这不昨天又犯了个错误,唉!我是没救了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

138

帖子

15

粉丝