`
本帖最后由 disorder 于 2015-11-28 17:41 编辑
这次来讲讲怎样通过spi-bridge对
STM32的IO口进行控制,包括输出高低电平及PWM信号
先放上最新编译的STM32的ROM,本次编译基于至2015年11月27日的代码,这次的更新中对PIN的定义进行了更新,同时增加了pwmWrite等语句。
控制IO语句的使用十分简单,与arduino相仿
目前可以使用的语句包括pinMode/digitalRead/digitalWrite/togglePin/analogRead/pmwWrite
本文主要演示pinMode/digitalWrite/pwmWrite的用法
首先,贴出pin的定义,同以往版本有所变化
- extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
- PMAP_ROW(GPIOA, 0,tiMER2, 1, ADC1, 0), /* D0/PA0 */
- PMAP_ROW(GPIOA, 1, TIMER2, 2, ADC1, 1), /* D1/PA1 */
- PMAP_ROW(GPIOA, 8, TIMER1, 1, NULL, ADCx), /* D2/PA8 */
- PMAP_ROW(GPIOB, 2, NULL, 0, NULL, ADCx), /* D3/PB2 */
- PMAP_ROW(GPIOA, 3, TIMER2, 4, ADC1, 3), /* D4/PA3 */
- PMAP_ROW(GPIOB, 0, TIMER3, 3, ADC1, 8), /* D5/PB0 */
- PMAP_ROW(GPIOA, 11, TIMER1, 4, NULL, ADCx), /* D6/PA11 */
- PMAP_ROW(GPIOA, 12, NULL, 0, NULL, ADCx), /* D7/PA12 */
- PMAP_ROW(GPIOB, 5, NULL, 0, NULL, ADCx), /* D8/PB5 */
- PMAP_ROW(GPIOA, 10, TIMER1, 3, NULL, ADCx), /* D9/PA10 */
- PMAP_ROW(GPIOA, 9, TIMER1, 2, NULL, ADCx), /* D10/PA9 */
- PMAP_ROW(GPIOB, 6, TIMER4, 1, NULL, ADCx), /* D11/PB6 */
- PMAP_ROW(GPIOB, 7, TIMER4, 2, NULL, ADCx), /* D12/PB7 */
- PMAP_ROW(GPIOB, 1, TIMER3, 4, ADC1, 9), /* D13/PB1 */
- PMAP_ROW(GPIOA, 2, TIMER2, 3, ADC1, 2), /* D14/PA2 */
- PMAP_ROW(GPIOA, 4, NULL, 0, NULL, ADCx), /* D15/PA4 */
- PMAP_ROW(GPIOA, 5, NULL, 0, NULL, ADCx), /* D16/PA5 */
- PMAP_ROW(GPIOA, 6, NULL, 0, NULL, ADCx), /* D17/PA6 */
- PMAP_ROW(GPIOA, 7, NULL, 0, NULL, ADCx), /* D18/PA7 */
- };
复制代码
其中支持PWM的PIN为0, 1, 2, 4, 5, 6, 9, 10, 11, 12, 13, 14
支持ADC的PIN为0, 1, 4, 5, 13, 14
pinMode用于设置管脚的属性(输入还是输出),命令格式为
mode可以数字或以下关键词
- OUTPUT
- OUTPUT_OPEN_DRAIN
- INPUT_ANALOG
- INPUT_PULLUP
- INPUT_PULLDOWN
- INPUT_FLOATING
- PWM
- PWM_OPEN_DRAIN
复制代码
举个例子,将PA0(也就是管脚0)设置为输出,命令为
通过spi-bridge命令如下:
- spi-bridge write "pinMode 0 OUTPUT"
复制代码
digitalWrite用于控制输出管脚的输出电平,命令格式如下:
- digitalWrite pinNum HIGH/LOW
复制代码
举个例子,将PA0置为高电平,命令如下:
有了以上两个命令后,就可以进行简单的GPIO实验了,这里我用了4个LED,通过限流电阻与GPIO相连
然后编写了简单的shell脚本,依次点亮LED,脚本如下:
- #!/bin/sh
- spi-bridge write "pinMode 0 0"
- spi-bridge write "pinMode 1 0"
- spi-bridge write "pinMode 2 0"
- spi-bridge write "pinMode 6 0"
- while true
- do
- spi-bridge write "digitalWrite 0 1"
- sleep 1
- spi-bridge write "digitalWrite 0 0"
- spi-bridge write "digitalWrite 1 1"
- sleep 1
- spi-bridge write "digitalWrite 1 0"
- spi-bridge write "digitalWrite 2 1"
- sleep 1
- spi-bridge write "digitalWrite 2 0"
- spi-bridge write "digitalWrite 6 1"
- sleep 1
- spi-bridge write "digitalWrite 6 0"
- done
复制代码
运行效果如下:
再来介绍pwmWrite命令,命令格式如下:
- pwmWrite pinNum duty_cycle
复制代码
其中,duty_cycle的取值范围是0~65535,占空比就是duty_cycle/65535
当然,首先要将管脚设置为PWM模式,通过以下命令
这里我使用逻辑分析仪来观察管脚上的PWM波形
首先将占空比设置为50%,运行以下命令
逻辑分析仪上采集到波形如下:
可以看到产生了频率是550Hz,占空比是50%的PWM波形
再次运行如下命令
逻辑分析仪上采集到波形如下:
可以看到产生了15.62%占空比的波形,与10000/65535相符。
可以看到,随着STM32上系统的不断完善,目前已经可以利用openwrt中的spi-bridge进行GPIO的控制了。
`
1
|