微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 主函数的语句直接跳过,麻烦帮忙看下程序是哪里出错了

主函数的语句直接跳过,麻烦帮忙看下程序是哪里出错了

时间:10-02 整理:3721RD 点击:
#include "stm32f10x_map.h"
void Key_Init(void);
void Key_Proc(void);
   char flag = 1;
int main(void)
{
     Key_Init();
while(1)
   {
   Key_Proc();
   if(flag) GPIOC->ODR &= 0xffff;
   if(!flag) GPIOC->ODR &= 0x0000;
   }

}
   void Key_Init(void)
   {
    RCC->APB2ENR |= 8;
        RCC->APB2ENR |= 0x0010;
        GPIOC->CRH &= 0xffffff00;
        GPIOC->CRH |= 0x00000033;
        GPIOC->CRL &= 0x00ffffff;
    GPIOC->CRL |= 0x33000000;
        GPIOC->ODR = 0xffff;
   }
   void Key_Proc(void)
   {
   short key = GPIOB->IDR;
   if(key & 0x8000)        
   {
   flag = !flag;
   }   
   }

按键只是上电第一次管用,再按就不管用了,调试的时候主函数里的两个if语句貌似直接就跳过去了。
谁知道这是哪里的问题

STM32不用库函数?你将flag设置为char类型是不对的,程序运行后,flag和!flag都是非零。将flag设置为bit看看。

if(flag) GPIOC->ODR &= 0xffff;
   if(!flag) GPIOC->ODR &= 0x0000;
改成
if(flag)
GPIOC->ODR &= 0xffff;
   if(!flag)
GPIOC->ODR &= 0x0000;

主函数最好加延时。否则IO的变化肉眼是看不出来的

你这个程序问题真多:
没有等待按键释放的程序语句,所以如果你的其他地方编写正确,也会以非常快的频率切换输出,因为一旦你的按键按下,Key_Proc都会一直不停的将flag取反;
你描述的问题是因为
    if(flag) GPIOC->ODR &= 0xffff;
    if(!flag) GPIOC->ODR &= 0x0000;
这两句产生,第一个if语句没有任何用处,如果你使用的编译器优化好一些的话,甚至这一句都不会产生代码,因为任何32位数与0xFFFF做与运算还是得任何32位数;
你在Key_Init中将输出初始化为0xFFFF,所以,一旦有按键按下,就仅有第二个if语句将输出设成0;
所以你的感觉就是只有第一次按键有效,使得输出变低;
字符类型可以作为逻辑变量使用是对的,其逻辑值取决于该变量是否为0;
if语句可以将逻辑判断和执行语句写在一行上,但是如果将判断和执行分行写,读起来会更明了一些;

多谢指点。

多谢指点。

多谢指点。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top