LED例程结构
1.JPG (219.72 KB, 下载次数: 0)
下载附件
1
2015-11-7 13:41 上传
主函数里面只有几个封装的函数,看不到模块时钟的开启。LED如何点亮呢?展开里面的函数看一下吧
2.JPG (30.91 KB, 下载次数: 0)
下载附件
2
2015-11-7 15:18 上传
3.JPG (14.95 KB, 下载次数: 0)
下载附件
3
2015-11-7 15:18 上传
4.JPG (19.61 KB, 下载次数: 0)
下载附件
4
2015-11-7 15:19 上传
层层封装,原来是个系统滴答,通过使能、禁止中断、设置滴答计数值来确定延时。
5.JPG (35 KB, 下载次数: 0)
下载附件
5
2015-11-7 15:20 上传
字面意思,GPIO快速初始化,这个速度相对于操作寄存器来说,是有点快,至少比看手册操作寄存器快。几个都是调用一个函数,原型如下:
- uint8_t GPIO_QuickInit(uint32_t instance, uint32_t pinx, GPIO_Mode_Type mode)
复制代码
三个参数,第一个是实例,第二个是端脚,第三个是GPIO模式。展开后
6.JPG (47.3 KB, 下载次数: 0)
下载附件
6
2015-11-7 15:26 上传
这个函数是把传递过来的实参给一个GPIO_InitTypeDef 类型的变量GPIO_InitStruct1的成员赋值,然后对寄存器初始化,最后返回实例
8.JPG (21.02 KB, 下载次数: 0)
下载附件
7
2015-11-7 15:38 上传
- <P>GPIO_Init(&GPIO_InitStruct1);</P>
复制代码
- struct reg_ops
- {
- void * addr;
- uint32_t mask;
- };
复制代码
这个圈子饶的真远,把数组的第二个元素值赋给第一个指针指向的地方,相当于
- SIM_SCGC5|=SIM_SCGC5_PORTB_MASK;
复制代码
也许有人问,为什么是PORTB呢,且看
23.JPG (30.72 KB, 下载次数: 0)
下载附件
2015-11-7 16:23 上传
24.JPG (21.29 KB, 下载次数: 0)
下载附件
2015-11-7 16:24 上传
看见01在数组里就是PORTB了.到这里,时钟总算出来了,接着往下还是一个开关语句
- case kPullDisabled:
- PORT_InstanceTable[instance]->PCR[pinIndex] &= ~PORT_PCR_PE_MASK;
- break;
复制代码
- static PORT_Type * const PORT_InstanceTable[] = PORT_BASES;
复制代码
- #define PORT_BASES PORT_BASE_PTRS
复制代码
- #define PORT_BASE_PTRS { PORTA, PORTB }
复制代码
- #define PORTB ((PORT_Type *)PORTB_BASE)
复制代码
意思就是PORTB_PCR11 &=~PORT_PCR_PE_MASK;
11.JPG (27.55 KB, 下载次数: 0)
下载附件
2015-11-7 16:45 上传
12.JPG (38.63 KB, 下载次数: 0)
下载附件
2015-11-7 16:45 上传
13.JPG (90 KB, 下载次数: 0)
下载附件
2015-11-7 16:46 上传
没有见到GPIO的推挽模式,只见到PORT的上拉\下拉\没有上下拉.
接着初始化GPIO引脚
- GPIO_PinConfig(Init->instance, Init->pinx, kOutput);
复制代码
- void GPIO_PinConfig(uint32_t instance, uint8_t pinIndex, GPIO_PinConfig_Type mode)
- {
- IP_CLK_ENABLE(instance);
- (mode == kOutput) ? (GPIO_InstanceTable[instance]->PDDR |= (1 << pinIndex)):(GPIO_InstanceTable[instance]->PDDR &= ~(1 << pinIndex));
- }
复制代码
这里又一次开启PORTB时钟.此处用了一个 表达式?A:B语句.
继续,跳出了开关语句
- PORT_PinMuxConfig(Init->instance, Init->pinx, kPinAlt1);
复制代码
- void PORT_PinMuxConfig(uint32_t instance, uint8_t pinIndex, PORT_PinMux_Type pinMux)
- {
- IP_CLK_ENABLE(instance);
- PORT_InstanceTable[instance]->PCR[pinIndex] &= ~(PORT_PCR_MUX_MASK);
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_MUX(pinMux);
- }
复制代码
又一次使能时钟,复用功能1.
- typedef enum
- {
- kPinAlt0,
- kPinAlt1,
- kPinAlt2,
- kPinAlt3,
- kPinAlt4,
- kPinAlt5,
- kPinAlt6,
- kPinAlt7,
- }PORT_PinMux_Type;
复制代码
层层封装,层层调用,看的头疼.到次PORTB时钟开启了,管脚设置成输出复用功能GPIO输出,虽然是GPIO 的推挽模式,但是到了PORT口,却是没有内部上下拉,学过STM 32的,GPIO可是实在的有内部推挽模式.
22.JPG (26.78 KB, 下载次数: 0) 下载附件
2015-11-7 15:58 上传
21.JPG (27.01 KB, 下载次数: 0) 下载附件
2015-11-7 15:48 上传
10.JPG (62.3 KB, 下载次数: 0) 下载附件
2015-11-7 15:44 上传
7.JPG (96.97 KB, 下载次数: 0) 下载附件
2015-11-7 15:34 上传
8
9.JPG (22.45 KB, 下载次数: 0) 下载附件
2015-11-7 15:43 上传
12.JPG (38.63 KB, 下载次数: 0) 下载附件
2015-11-7 16:45 上传
|