找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 273|回复: 3
打印 上一主题 下一主题
收起左侧

stm32开启IO口时钟和设置开楼为何只能放在循环内部?

[复制链接]
跳转到指定楼层
楼主
ID:1117224 发表于 2025-12-25 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习stm32,现在学理解寄存器,头文件是空的,SystemInit函数也是空的。
剩下的部分我写了两个:第一个开启IO口时钟和设置输出模式放在循环内部 小灯闪烁;
                                   第二个开启IO口时钟和设置输出模式放在循环外部 小灯不闪烁。
                                   一直没搞懂这是为什么?求助大佬解惑!
  1. #include "stm32f10x.h"

  2. void SystemInit(void)
  3. {
  4.     // 函数体为空,使用内部HSI 8MHz时钟
  5. }

  6. int main(void)
  7. {
  8.     volatile int i;
  9.    
  10.     while(1)
  11.     {
  12.         // 1. 开启GPIOB时钟
  13.         *(unsigned int*)0x40021018 |= (1 << 3);
  14.    
  15.         // 2. 配置PB0为开漏输出,10MHz速度
  16.         *(unsigned int*)0x40010c00 |= (1 << (4*0));  
  17.         
  18.         // LED亮(低电平)
  19.         *(unsigned int*)0x40010c0c &= ~(1 << 0);
  20.         for(i = 0; i < 1000000; i++);
  21.         
  22.         // LED灭(高电平)
  23.         *(unsigned int*)0x40010c0c |= (1 << 0);
  24.         for(i = 0; i < 1000000; i++);
  25.     }
  26. }
复制代码
  1. #include "stm32f10x.h"

  2. void SystemInit(void)
  3. {
  4.     // 函数体为空,使用内部HSI 8MHz时钟
  5. }

  6. int main(void)
  7. {
  8.     volatile int i;
  9.    
  10.      // 1. 开启GPIOB时钟
  11.      *(unsigned int*)0x40021018 |= (1 << 3);
  12.    
  13.      // 2. 配置PB0为开漏输出,10MHz速度
  14.      *(unsigned int*)0x40010c00 |= (1 << (4*0));  
  15.         
  16.     while(1)
  17.     {
  18.         // LED亮(低电平)
  19.         *(unsigned int*)0x40010c0c &= ~(1 << 0);
  20.         for(i = 0; i < 1000000; i++);
  21.         
  22.         // LED灭(高电平)
  23.         *(unsigned int*)0x40010c0c |= (1 << 0);
  24.         for(i = 0; i < 1000000; i++);
  25.     }
  26. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:879809 发表于 2025-12-26 15:22 | 只看该作者
仿真器打断点看亮灭语句执行了没有。
回复

使用道具 举报

板凳
ID:469589 发表于 2026-1-2 08:15 | 只看该作者
放到int main(void)前面试试。
回复

使用道具 举报

地板
ID:469589 发表于 2026-1-2 08:18 | 只看该作者
有可能这个:没有输出,是靠上面的开路才输出的
       // LED亮(低电平)
        *(unsigned int*)0x40010c0c &= ~(1 << 0);
        for(i = 0; i < 1000000; i++);
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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