打印
[Kinetis]

FRDM-KL02 LED例程学习

[复制链接]
1305|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WAMCNCN|  楼主 | 2015-11-7 21:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DM, LED, pi, ST, GPIO
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 上传






相关帖子

沙发
C洛达尔多| | 2015-11-8 20:58 | 只看该作者
这个是keil版本的吗,现在只是对keil mdk比较熟悉一些

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-11-9 10:47 | 只看该作者
楼主这个帖子应该是资料分享吧?
关于资料分享,楼主不需要以未结帖形式,否则会和问题贴混淆的。

使用特权

评论回复
地板
WAMCNCN|  楼主 | 2015-11-9 19:26 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-9 10:47
楼主这个帖子应该是资料分享吧?
关于资料分享,楼主不需要以未结帖形式,否则会和问题贴混淆的。 ...

这是我在FSL社区写的,分享过来的,一发帖就是未结帖,我也不想的:L

使用特权

评论回复
5
WAMCNCN|  楼主 | 2015-11-9 19:27 | 只看该作者
C洛达尔多 发表于 2015-11-8 20:58
这个是keil版本的吗,现在只是对keil mdk比较熟悉一些

IAR的 ,我原来也使用KEIL,不过学会了IAR也不错

使用特权

评论回复
6
Roderman_z| | 2015-11-12 14:30 | 只看该作者
WAMCNCN 发表于 2015-11-9 19:27
IAR的 ,我原来也使用KEIL,不过学会了IAR也不错

IAR好用还是keil好用呢?

使用特权

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

本版积分规则

50

主题

1882

帖子

1

粉丝