打印
[STM8]

实验分享-【STM8-SO8】02-点灯2

[复制链接]
411|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AN5047_STM8S001J3微控制器的入门指南
AN5047  Application note
Getting started with the STM8S001J3 microcontroller
DM00405517_ENV2.pdf (448.37 KB, 下载次数: 4)

在这份文件的第 7 章节对于 STM8S001J3 器件的启动代码配置有 3 点建议:

1. 将芯片内部未拉出的 GPIOs 配置在合适的状态
片上有多支 GPIO 未拉到器件的引脚上,如 PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5, PF4。在器件 RESET 之后这些引脚自动会被配置成悬浮输入模式,建议将这些 GPIO 配置成输出模式与低电平状态,这对于减少 EMC 与降低功耗是有帮助的。

2. SWIM 改变引脚复用功能前要先延迟
烧录芯片除了 SWIM 引脚之外还需要 NRST 引脚,不过 8 引脚的 STM8 并没有提供 NRST 引脚,因此当 SWIM 这支引脚要复用为其他的 GPIO 功能时,建议在上电后增加最多 5 秒的延迟后再来更改引脚的功能,这个目的是让芯片上电后可以进入 SWIM 模式重新烧写,否则会让烧录器无法通过 SWIM 接口连接,并且永久锁定,也就是该芯片就变砖了!等程序功能完成并确定不会再修改后再删除这个初始延迟的代码。

3. 正确的 GPIO 引脚模式设定
STM8S001J3 器件的引脚提供了多个 GPIO 的复用功能,为某个 GPIO 配置的模式也会影响到相同引脚上的其他 GPIO,因此正确设置 GPIO 模式对于避免 GPIO 之间的冲突是非常重要的。

比如说 PD1,PC6,PD3.PD5 这些 GPIO 都在 pin8 上,在 PD1 做上拉设置后对于 PC6,PD3,PD5 同样是有上拉的作用。

文件里头提供了启动代码例程:
  • /* This delay should be added just after reset to have access to SWIM pin
  • and to be able to reprogram the device after power on (otherwise the device
  • will be locked) */
  • #define STARTUP_SWIM_DELAY_5S    \
  • {                                \
  •   ASM("       PUSHW X        \n" \
  •       "       PUSH  A        \n" \
  •       "       LDW X, #0xFFFF \n" \
  •       "loop1: LD A, #50      \n" \
  •                                  \
  •       "loop2: DEC A          \n" \
  •       "       JRNE loop2     \n" \
  •                                  \
  •       "       DECW X         \n" \
  •       "       JRNE loop1     \n" \
  •                                  \
  •       "       POP A          \n" \
  •       "       POPW X           " ); \
  • }
  • /* not connected pins as output low state (the best EMC immunity)
  • (PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5, PF4) */
  • #define CONFIG_UNUSED_PINS_STM8S001 \
  • { \
  •   GPIOA->DDR |= GPIO_PIN_2; \
  •   GPIOB->DDR |= GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7; \
  •   GPIOC->DDR |= GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; \
  •   GPIOD->DDR |= GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_7; \
  •   GPIOE->DDR |= GPIO_PIN_5; \
  •   GPIOF->DDR |= GPIO_PIN_4; \
  • }

[color=rgb(51, 102, 153) !important]复制代码


在上一个实验我们使用了 pin5,6,7 做为驱动 LED 的输出引脚,这一次我们再加入 pin8 实现 4 颗 LED 的亮灭显示。程序中加入上述的启动代码,烧录前需先断开 pin8 所连接的 LED,电路重新上电后 5 秒内进行烧录,烧录完成后等待 5 秒钟后 LED 开始亮灭。

main 回圈:
  • void main(void)
  • {
  •   /* -------------STM8S001 startup-------------- */
  •   /* configure unbonded pins */
  •   CONFIG_UNUSED_PINS_STM8S001;
  •   /* delay for SWIM connection: ~5seconds */
  •   STARTUP_SWIM_DELAY_5S;
  •   /* ------------------------------------------- */
  •   /* Infinite loop */
  •   GPIO_Init(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   GPIO_Init(LED4_GPIO_PORT, (GPIO_Pin_TypeDef)LED4_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
  •   while (1)
  •   {
  •     GPIO_WriteReverse(LED1_GPIO_PORT, (GPIO_Pin_TypeDef)LED1_GPIO_PINS);
  •     Delay(0xFFFF);
  •     GPIO_WriteReverse(LED2_GPIO_PORT, (GPIO_Pin_TypeDef)LED2_GPIO_PINS);
  •     Delay(0xFFFF);
  •     GPIO_WriteReverse(LED3_GPIO_PORT, (GPIO_Pin_TypeDef)LED3_GPIO_PINS);
  •     Delay(0xFFFF);
  •     GPIO_WriteReverse(LED4_GPIO_PORT, (GPIO_Pin_TypeDef)LED4_GPIO_PINS);
  •     Delay(0xFFFF);
  •   }
  • }


[color=rgb(51, 102, 153) !important]复制代码


源代码:
B02.rar (715.25 KB, 下载次数: 3)

运行结果:
本文转载于【STM8-SO8】02-点灯2
http://www.stmcu.org.cn/module/forum/thread-619271-1-1.html



使用特权

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

本版积分规则

个人签名:每天都要开心呀

210

主题

505

帖子

4

粉丝