打印

流水灯GPIO_Init()问题

[复制链接]
271|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
没名字的人|  楼主 | 2019-11-24 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*备份原CRL 寄存器的值*/
31. tmpreg = GPIOx->CRL;
32. /*循环,一个循环设置一个寄存器位*/
33. for (pinpos = 0x00; pinpos < 0x08; pinpos++)
34. {
35. /*pos 的值为1 左移pinpos 位*/
36. pos = ((uint32_t)0x01) << pinpos;
37. /* 令pos 与输入参数GPIO_PIN 作位与运算,为下面的判断作准备*/
38. currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
39. /*判断,若currentpin=pos,说明GPIO_PIN 参数中含的第pos 个引脚需要配置*/
40. if (currentpin == pos)
41. {
42. /*pos 的值左移两位(乘以4),因为寄存器中4 个寄存器位配置一个引脚*/
43. pos = pinpos << 2;
44. /*以下两个句子,把控制这个引脚的4 个寄存器位清零,其它寄存器位不变*/
45. pinmask = ((uint32_t)0x0F) << pos;
46. tmpreg &= ~pinmask;
47. /* 向寄存器写入将要配置的引脚的模式*/
48. tmpreg |= (currentmode << pos);
49. /* 复位GPIO 引脚的输入输出默认值*/
50. /*判断是否为下拉输入模式*/
51. if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
52. {
53. /*下拉输入模式,引脚默认置0,对BRR 寄存器写1 可对引脚置0*/
54. GPIOx->BRR = (((uint32_t)0x01) << pinpos);
55. }
56. else
57. {
58. /*判断是否为上拉输入模式*/
59. if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
60. {
61. /*上拉输入模式,引脚默认值为1,对BSRR 寄存器写1 可对引脚置1*/
62. GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
63. }
64. }
65. }
66. }
67. /*把前面处理后的暂存值写入到CRL 寄存器之中*/
68. GPIOx->CRL = tmpreg;






1.
42. /*pos 的值左移两位(乘以4),因为寄存器中4 个寄存器位配置一个引脚*/
43. pos = pinpos << 2;
这个我看过CRL是每4位控制一个引脚 哪和左移(比如0x01变成0x04)什么关系啊不懂啊!



2.
44. /*以下两个句子,把控制这个引脚的4 个寄存器位清零,其它寄存器位不变*/
45. pinmask = ((uint32_t)0x0F) << pos;
46. tmpreg &= ~pinmask;
这个是怎么做到清零的,没算出来,看不懂

使用特权

评论回复

相关帖子

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

本版积分规则

420

主题

432

帖子

0

粉丝