找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32求助,while为何不能循环?

[复制链接]
跳转到指定楼层
楼主
ID:135253 发表于 2017-11-4 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看看stm32,感觉麻烦多了,时钟配置与端口配置,还是不得其法,下面是参考的一段主程序,

个人认为应该是PA.2  PA.3闪烁的,结果调试看IO口,一直是PA.3=1 PA.2=0,似乎while只运行一次就停止了,不知道为什么原因,新手,请大神指教!

  1. /* 头文件    ------------------------------------------------------------------*/

  2. #include "stm32f10x_lib.h"
  3. #define delay(n)    while((n)--)

  4. void RCC_Configuration(void);      //RCC(Reset and Clock Control group)复位与时钟控制寄存器组,七个组员,
  5. void GPIO_Configuration(void);     //端口配置

  6. int main(void)
  7. {   
  8.           vu32 n=2000000;          /* 设置延时参数 2000000=0.25s */
  9.           RCC_Configuration();        /* 设置系统时钟 */                        
  10.           GPIO_Configuration();    /* 设置GPIO端口 */
  11.                  
  12.         while(1)
  13.      {
  14.           GPIO_SetBits(GPIOA , GPIO_Pin_2);            // PA.2输出高电平
  15.           GPIO_ResetBits(GPIOA , GPIO_Pin_3);             // PA.3输出低电平         
  16.           delay(n);
  17.          
  18.           GPIO_ResetBits(GPIOA , GPIO_Pin_2);          // PA.2输出低电平
  19.           GPIO_SetBits(GPIOA , GPIO_Pin_3);                     // PA.3输出高电平
  20.           delay(n);
  21.      }
  22. }

  23. /*******************************************************************************
  24. * 函数名        : RCC_Configuration
  25. * 函数描述  : 设置系统各部分时钟
  26. * 过程      :1
  27. *******************************************************************************/

  28. void RCC_Configuration(void)
  29. {
  30.       
  31.         ErrorStatus HSEStartUpStatus;                     /* 定义枚举类型变量HSEStartUpStatus,检测外部高速时钟HSE启动状况*/
  32.          
  33.           RCC_DeInit();                                     /* 复位系统时钟设置*/
  34.       
  35.           RCC_HSEConfig(RCC_HSE_ON);                        /* 开启HSE*/         
  36.           HSEStartUpStatus = RCC_WaitForHSEStartUp();       /* 等待HSE起振并稳定*/
  37.       
  38.       
  39.           if(HSEStartUpStatus == SUCCESS)                   /* 判断HSE起是否振成功,是则进入if()内部 */
  40.           {         
  41.           RCC_HCLKConfig(RCC_SYSCLK_Div1);             /* 选择HCLK(AHB)时钟源 为SYSCLK 1分频 */   
  42.           RCC_PCLK2Config(RCC_HCLK_Div1);                 /* 选择PCLK2(APB2)时钟源---为HCLK(AHB)1分频 */   
  43.           RCC_PCLK1Config(RCC_HCLK_Div2);                 /* 选择PCLK1(APB1)时钟源---为HCLK(AHB)2分频 */

  44.          
  45.           FLASH_SetLatency(FLASH_Latency_2);                     /* 设置FLASH延时周期数为2 */           
  46.           FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  /* 使能FLASH预取缓存 */

  47.          
  48.           RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);   /* 选择锁相环(PLL)时钟源---为HSE1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */           
  49.           RCC_PLLCmd(ENABLE);                                    /* 使能PLL */   
  50.           while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);        /* 等待PLL输出稳定 */   
  51.           RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);             /* 选择SYSCLK时钟源为PLL */        
  52.           while(RCC_GetSYSCLKSource() != 0x08);                  /* 等待PLL成为SYSCLK时钟源 */
  53.           }
  54.    
  55.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);/* 打开APB2总线上的GPIOA时钟*/
  56. }


  57. /*******************************************************************************
  58. * 函数名                  : GPIO_Configuration
  59. * 函数描述            : 设置各GPIO端口功能
  60. * 输入参数      : 无
  61. * 输出结果      : 无
  62. * 返回值        : 无
  63. *******************************************************************************/

  64. void GPIO_Configuration(void)
  65. {
  66.           GPIO_InitTypeDef GPIO_InitStructure;

  67.           /* 设置PA2,PA3口为推挽输出,最大翻转频率为50MHz*/
  68.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  69.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  71.      
  72.           GPIO_Init(GPIOA , &GPIO_InitStructure);   
  73. }
复制代码


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

使用道具 举报

沙发
ID:135253 发表于 2017-11-4 10:01 | 只看该作者
有些注释语句是自己加的,可能显得很不专业
回复

使用道具 举报

板凳
ID:225243 发表于 2017-11-4 11:15 | 只看该作者
你debug一下就知道问题处在那里了
回复

使用道具 举报

地板
ID:74687 发表于 2023-1-20 13:55 | 只看该作者
我也遇到这个问题了,我觉得你这个程序灯应该是点不亮的,GPIO_Configuration函数加段代码: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);就可以点亮灯,但是两个灯没有进行闪烁,而是一直亮的。
回复

使用道具 举报

5#
ID:965189 发表于 2023-1-20 15:20 | 只看该作者
延时太短,闪了你也看不到。
回复

使用道具 举报

6#
ID:419968 发表于 2023-1-20 20:29 | 只看该作者
操作stm32 的外设必须先使能外设的时钟
回复

使用道具 举报

7#
ID:74687 发表于 2023-1-21 08:30 | 只看该作者
这个问题的原因终于找到了,while(1)这个死循环里,n这个变量在delay后已经变了,不再是第一次赋值的值了,所以每次delay后再进行一次赋值,或者直接进行define进行定义常量。
回复

使用道具 举报

8#
ID:883242 发表于 2023-1-23 11:16 | 只看该作者
n每次使用都要重新赋值,这是简单的语法问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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