发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[讨论] 【WRTnode2R试用体验】通过spi-bridge与STM32通信(三)
2015-11-28 17:41:38  2339 STM32 GPIO PWM
分享
本帖最后由 disorder 于 2015-11-28 17:41 编辑

这次来讲讲怎样通过spi-bridge对STM32的IO口进行控制,包括输出高低电平及PWM信号
WRTnode2r_stm32_20151128.zip (17.34 KB, 下载次数: 14)


先放上最新编译的STM32的ROM,本次编译基于至2015年11月27日的代码,这次的更新中对PIN的定义进行了更新,同时增加了pwmWrite等语句。
控制IO语句的使用十分简单,与arduino相仿
目前可以使用的语句包括pinMode/digitalRead/digitalWrite/togglePin/analogRead/pmwWrite
本文主要演示pinMode/digitalWrite/pwmWrite的用法

首先,贴出pin的定义,同以往版本有所变化
  1. extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
  2.     PMAP_ROW(GPIOA,   0, tiMER2,  1, ADC1,    0), /* D0/PA0 */
  3.     PMAP_ROW(GPIOA,   1, TIMER2,  2, ADC1,    1), /* D1/PA1 */
  4.     PMAP_ROW(GPIOA,   8, TIMER1,  1, NULL, ADCx), /* D2/PA8 */
  5.     PMAP_ROW(GPIOB,   2,   NULL,  0, NULL, ADCx), /* D3/PB2 */
  6.     PMAP_ROW(GPIOA,   3, TIMER2,  4, ADC1,    3), /* D4/PA3 */
  7.     PMAP_ROW(GPIOB,   0, TIMER3,  3, ADC1,    8), /* D5/PB0 */
  8.     PMAP_ROW(GPIOA,  11, TIMER1,  4, NULL, ADCx), /* D6/Pa11 */
  9.     PMAP_ROW(GPIOA,  12,   NULL,  0, NULL, ADCx), /* D7/PA12 */
  10.     PMAP_ROW(GPIOB,   5,   NULL,  0, NULL, ADCx), /* D8/PB5 */
  11.     PMAP_ROW(GPIOA,  10, TIMER1,  3, NULL, ADCx), /* D9/PA10 */
  12.     PMAP_ROW(GPIOA,   9, TIMER1,  2, NULL, ADCx), /* D10/PA9 */
  13.     PMAP_ROW(GPIOB,   6, TIMER4,  1, NULL, ADCx), /* D11/PB6 */
  14.     PMAP_ROW(GPIOB,   7, TIMER4,  2, NULL, ADCx), /* D12/PB7 */
  15.     PMAP_ROW(GPIOB,   1, TIMER3,  4, ADC1,    9), /* D13/PB1 */
  16.     PMAP_ROW(GPIOA,   2, TIMER2,  3, ADC1,    2), /* D14/PA2 */

  17.     PMAP_ROW(GPIOA,   4,   NULL,  0, NULL, ADCx), /* D15/PA4 */
  18.     PMAP_ROW(GPIOA,   5,   NULL,  0, NULL, ADCx), /* D16/PA5 */
  19.     PMAP_ROW(GPIOA,   6,   NULL,  0, NULL, ADCx), /* D17/PA6 */
  20.     PMAP_ROW(GPIOA,   7,   NULL,  0, NULL, ADCx), /* D18/PA7 */
  21. };
复制代码
其中支持PWM的PIN为0, 1, 2, 4, 5, 6, 9, 10, 11, 12, 13, 14
支持ADC的PIN为0, 1, 4, 5, 13, 14

pinMode用于设置管脚的属性(输入还是输出),命令格式为
  1. pinMode pinNum mode
复制代码
mode可以数字或以下关键词
  1. OUTPUT
  2. OUTPUT_OPEN_DRAIN
  3. INPUT_ANALOG
  4. INPUT_PULLUP
  5. INPUT_PULLDOWN
  6. INPUT_FLOATING
  7. PWM
  8. PWM_OPEN_DRAIN
复制代码
举个例子,将PA0(也就是管脚0)设置为输出,命令为
  1. pinMode 0 OUTPUT
复制代码
通过spi-bridge命令如下:
  1. spi-bridge write "pinMode 0 OUTPUT"
复制代码

digitalWrite用于控制输出管脚的输出电平,命令格式如下:
  1. digitalWrite pinNum HIGH/LOW
复制代码
举个例子,将PA0置为高电平,命令如下:
  1. digitalWrite 0 HIGH
复制代码

有了以上两个命令后,就可以进行简单的GPIO实验了,这里我用了4个LED,通过限流电阻与GPIO相连
IMG_20151128_115426.jpg IMG_20151128_115435.jpg

然后编写了简单的shell脚本,依次点亮LED,脚本如下:
  1. #!/bin/sh
  2. spi-bridge write "pinMode 0 0"
  3. spi-bridge write "pinMode 1 0"
  4. spi-bridge write "pinMode 2 0"
  5. spi-bridge write "pinMode 6 0"
  6. while true
  7. do
  8.   spi-bridge write "digitalWrite 0 1"
  9.   sleep 1
  10.   spi-bridge write "digitalWrite 0 0"
  11.   spi-bridge write "digitalWrite 1 1"
  12.   sleep 1
  13.   spi-bridge write "digitalWrite 1 0"
  14.   spi-bridge write "digitalWrite 2 1"
  15.   sleep 1
  16.   spi-bridge write "digitalWrite 2 0"
  17.   spi-bridge write "digitalWrite 6 1"
  18.   sleep 1
  19.   spi-bridge write "digitalWrite 6 0"
  20. done
复制代码
运行效果如下:
VID_20151128_112938_0-213.gif


再来介绍pwmWrite命令,命令格式如下:
  1. pwmWrite pinNum duty_cycle
复制代码
其中,duty_cycle的取值范围是0~65535,占空比就是duty_cycle/65535
当然,首先要将管脚设置为PWM模式,通过以下命令
  1. pinMode 0 PWM
复制代码
这里我使用逻辑分析仪来观察管脚上的PWM波形
IMG_20151128_121557.jpg

首先将占空比设置为50%,运行以下命令
  1. pwmWrite 0 32768
复制代码
逻辑分析仪上采集到波形如下:
pwm1.PNG

可以看到产生了频率是550Hz,占空比是50%的PWM波形
再次运行如下命令
  1. pwmWrite 0 10000
复制代码
逻辑分析仪上采集到波形如下:
pwm2.PNG

可以看到产生了15.62%占空比的波形,与10000/65535相符。


可以看到,随着STM32上系统的不断完善,目前已经可以利用openwrt中的spi-bridge进行GPIO的控制了。
1
2015-11-28 17:41:38   评论 分享淘帖

相关讨论

8 个讨论
楼主出的教程都是精品!
2015-11-29 00:24:34 评论

举报

楼主绝对神! 顶一个
2015-12-1 15:54:17 评论

举报

楼主这篇确实精彩,想问问怎么改变PWM的频率呀?
我会告诉你真名 发表于 2015-12-3 18:28
楼主这篇确实精彩,想问问怎么改变PWM的频率呀?

可以,需要下载RT-Thread源码,然后自己修改STM32的初始化代码
2015-12-6 13:57:50 评论

举报

嗯,好的,还以为是可以通过SPI来改变频率呢,回头试试
谢谢楼主分享。。。
2015-12-9 21:59:02 评论

举报

谢谢楼主分享,是一篇很棒的教程,学习了!!!
2015-12-15 20:07:04 评论

举报

只有小组成员才能发言,加入小组>>

1558个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /6 下一条

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