极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 142263|回复: 32

【玩STM32】STM32Duino的引脚映射,ADC,PWM等介绍

[复制链接]
发表于 2017-6-9 15:03:55 | 显示全部楼层 |阅读模式
本帖最后由 Ansifa 于 2017-7-31 23:02 编辑

基于迷你强的STM32duino文章,感觉非常有价值,这小单片机做Arduino实在太强了,甩AVR的几条街,结合Maple Mini研究了一下,总结下面基础资料:


0、编程语法参考
http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/language.html

1、引脚对应关系:
32个GPIO,也可以用序号表达。

序号        物理引脚
0        PA0
1        PA1
2        PA2
3        PA3
4        PA4
5        PA5
6        PA6
7        PA7
8        PA8
9        PA9
10        PA10
11        PA11
12        PA12
13        PA13
14        PA14
15        PA15
16        PB0
17        PB1
18        PB2
19        PB3
20        PB4
21        PB5
22        PB6
23        PB7
24        PB8
25        PB9
26        PB10
27        PB11
28        PB12
29        PB13
30        PB14
31        PB15
32        PC13
33        PC14
34        PC15

2、允许PWM引脚:
序号        物理引脚
0        PA0
1        PA1
2        PA2
3        PA3
6        PA6
7        PA7
8        PA8
9        PA9
10        PA10
16        PB0
22        PB6
23        PB7

PWM引脚简易测试程序,总共有12个PWM引脚,16bit即65536级PWM,很精密了:
  1. void setup()
  2. {
  3.         pinMode(PB0, PWM);
  4.         pinMode(PA7, PWM);
  5.         pinMode(PA6, PWM);
  6.         pinMode(PA3, PWM);
  7.         pinMode(PA2, PWM);
  8.         pinMode(PA1, PWM);
  9.         pinMode(PA0, PWM);
  10.         pinMode(PB7, PWM);
  11.         pinMode(PB6, PWM);
  12.         pinMode(PA10, PWM);
  13.         pinMode(PA9, PWM);
  14.         pinMode(PA8, PWM);
  15. }
  16. void loop()
  17. {
  18.         for (int i = 0; i < 65536; i++)
  19.         {
  20.                 delayMicroseconds(40);
  21.                 pwmWrite(PB0, i);
  22.                 pwmWrite(PA7, i);
  23.                 pwmWrite(PA6, i);
  24.                 pwmWrite(PA3, i);
  25.                 pwmWrite(PA2, i);
  26.                 pwmWrite(PA1, i);
  27.                 pwmWrite(PA0, i);
  28.                 pwmWrite(PB7, i);
  29.                 pwmWrite(PB6, i);
  30.                 pwmWrite(PA10, i);
  31.                 pwmWrite(PA9, i);
  32.                 pwmWrite(PA8, i);
  33.         }
  34. }
复制代码

PWM精度太高了,驱动LED没必要那么高,再来一个指数式适合驱动LED的,看起来亮度更线性。

  1. void setup() {
  2.   pinMode(PB0, PWM);
  3.   pinMode(PA7, PWM);
  4.   pinMode(PA6, PWM);
  5.   pinMode(PA3, PWM);
  6.   pinMode(PA2, PWM);
  7.   pinMode(PA1, PWM);
  8.   pinMode(PA0, PWM);
  9.   pinMode(PB7, PWM);
  10.   pinMode(PB6, PWM);
  11.   pinMode(PA10, PWM);
  12.   pinMode(PA9, PWM);
  13.   pinMode(PA8, PWM);
  14. }
  15. void loop() {
  16.   //指数式增加亮度,适合驱动LED,看起来亮度更线性
  17.   for (int i = 0; i < 256; i++)
  18.   {
  19.     delay(20);
  20.     pwmWrite(PB0, i * i);
  21.     pwmWrite(PA7, i * i);
  22.     pwmWrite(PA6, i * i);
  23.     pwmWrite(PA3, i * i);
  24.     pwmWrite(PA2, i * i);
  25.     pwmWrite(PA1, i * i);
  26.     pwmWrite(PA0, i * i);
  27.     pwmWrite(PB7, i * i);
  28.     pwmWrite(PB6, i * i);
  29.     pwmWrite(PA10, i * i);
  30.     pwmWrite(PA9, i * i);
  31.     pwmWrite(PA8, i * i);
  32.   }
  33. }
复制代码

或者用序号表示:

  1. int pins[12] = {0, 1, 2, 3, 6, 7, 8, 9, 10, 16, 22, 23};
  2. void setup()
  3. {
  4.   for (int i = 0; i < 12; i++)
  5.   {
  6.     pinMode(pins[i], PWM);
  7.   }
  8. }
  9. void loop()
  10. {
  11.   for (int i = 0; i < 100; i++)
  12.   {
  13.     for (int j = 0; j < 12; j++)
  14.     {
  15.       pwmWrite(pins[j], i * i);
  16.     }
  17.     delay(20);
  18.   }
  19. }
复制代码


3、允许的ADC引脚:
ADC总共有10个通道,12bit即4096级。引脚如下
物理引脚,ADC通道
PA0        CH0
PA1        CH1
PA2        CH2
PA3        CH3
PA4        CH4
PA5        CH5
PA6        CH6
PA7        CH7
PB0        -(不能用序号表达)
PB1        -(不能用序号表达)

ADC测试程序:
  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   pinMode(PB0, INPUT_ANALOG);
  5.   pinMode(PA7, INPUT_ANALOG);
  6.   pinMode(PA6, INPUT_ANALOG);
  7.   pinMode(PA5, INPUT_ANALOG);
  8.   pinMode(PA4, INPUT_ANALOG);
  9.   pinMode(PA3, INPUT_ANALOG);
  10.   pinMode(PA2, INPUT_ANALOG);
  11.   pinMode(PA1, INPUT_ANALOG);
  12.   pinMode(PA0, INPUT_ANALOG);
  13.   pinMode(PB1, INPUT_ANALOG);
  14. }
  15. void loop()
  16. {
  17.   delay(50);
  18.   Serial.print("\tPB0="); Serial.print(analogRead(PB0));
  19.   Serial.print("\tPA7="); Serial.print(analogRead(PA7));
  20.   Serial.print("\tPA6="); Serial.print(analogRead(PA6));
  21.   Serial.print("\tPA5="); Serial.print(analogRead(PA5));
  22.   Serial.print("\tPA4="); Serial.print(analogRead(PA4));
  23.   Serial.print("\tPA3="); Serial.print(analogRead(PA3));
  24.   Serial.print("\tPA2="); Serial.print(analogRead(PA2));
  25.   Serial.print("\tPA1="); Serial.print(analogRead(PA1));
  26.   Serial.print("\tPA0="); Serial.print(analogRead(PA0));
  27.   Serial.print("\tPB1="); Serial.println(analogRead(PB1));
  28. }
复制代码


4、允许的串口
总共3个硬件外接串口Serial1、Serial2、Serial3,一个USB虚拟串口Serial:

  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   Serial1.begin(115200);  //TX=PA9,RX=PA10
  5.   Serial2.begin(115200);  //TX=PA2,RX=PA3
  6.   Serial3.begin(115200);  //TX=PB10,RX=PB11
  7. }
  8. void loop()
  9. {
  10.   delay(100);
  11.   Serial.println("Test Serial");
  12.   Serial1.println("Test Serial1");
  13.   Serial2.println("Test Serial2");
  14.   Serial3.println("Test Serial3");
  15. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2019-9-29 18:36:40 | 显示全部楼层
bg2rhe 发表于 2019-6-6 17:34
已解决。

爬了一下罗杰克拉克的网站,发现原来是个坑。

HardwareSerial Serial2(USART2);
HardwareSerial Serial3(USART3);

补一下哈哈
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-10 13:43:35 | 显示全部楼层
。。。。。。。。这是抛弃AVR的节奏ing
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-10 15:44:57 | 显示全部楼层
弘毅 发表于 2017-6-10 13:43
。。。。。。。。这是抛弃AVR的节奏ing


主频快,AD多PWM多串口还多,多出来的串口可以接几个MAX3232又稳定,没办法,对手太强劲
回复 支持 反对

使用道具 举报

发表于 2017-6-10 16:23:33 | 显示全部楼层
这个确实甩atmega系列的好几条街
回复 支持 反对

使用道具 举报

发表于 2017-6-10 18:12:10 | 显示全部楼层
库再多点我就可以扔掉arduino了
回复 支持 反对

使用道具 举报

发表于 2017-6-10 19:57:46 | 显示全部楼层
既然是今天新帖 STM32像Arduino风格很喜欢
回复 支持 反对

使用道具 举报

发表于 2017-6-11 11:04:45 | 显示全部楼层
源地的这块32还是很经典的,一般都用它
回复 支持 反对

使用道具 举报

发表于 2017-6-11 12:14:27 | 显示全部楼层
老铁!请问哪里有卖的啊!
回复 支持 反对

使用道具 举报

发表于 2017-6-11 16:04:18 | 显示全部楼层
我还特意买了块Maple Mini
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-15 13:52:56 | 显示全部楼层
王八顺 发表于 2017-6-11 12:14
老铁!请问哪里有卖的啊!

淘宝搜“STM32F103C8T6 系统板”挑个同样子的就行,价格十一二
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-15 13:53:31 | 显示全部楼层
bing7583380 发表于 2017-6-11 16:04
我还特意买了块Maple Mini

我说的是淘宝十块钱货,不是maple,太贵了
回复 支持 反对

使用道具 举报

发表于 2017-6-15 23:31:10 | 显示全部楼层
终于等到你的资料了,多串口如何使用啊?我等英文不好软件不行的,紧跟你的步伐吧,还有I2C   SPI等,这样就全了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-16 13:12:07 | 显示全部楼层
太行摄狼 发表于 2017-6-15 23:31
终于等到你的资料了,多串口如何使用啊?我等英文不好软件不行的,紧跟你的步伐吧,还有I2C   SPI等,这样 ...


多串口用法可以参考mega2560的硬串口,一般TX/RX交叉接一个CH340就可以和电脑通信了,也可以接其他串口传感器之类。iicspi验证需要搭传感器,稍后测试
回复 支持 反对

使用道具 举报

发表于 2017-6-17 19:31:33 | 显示全部楼层
arduino上的库都支持吗?
回复 支持 反对

使用道具 举报

发表于 2017-6-17 23:27:10 | 显示全部楼层
帮忙看看啥问题,原来是没问题的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 01:27 , Processed in 0.095276 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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