标题:
STM32 LED灯闪烁程序无错但没有闪烁效果
[打印本页]
作者:
哈哈我哈哈
时间:
2019-7-15 19:21
标题:
STM32 LED灯闪烁程序无错但没有闪烁效果
下面是我写的程序
#include "stm32f10x.h"
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
int main (void)//亮蓝光
{
#if 0 //条件编译屏蔽此部分代码
//打开GPIOB端口的时钟
*(unsigned int*)0x40021018 |=((1)<<3);
//配置IO口为输出
*(unsigned int*)0x40010C00 |=((1)<<(4*1)); //置1操作,10进制的1
//控制ODR寄存器 PB1
*(unsigned int*)0x40010C0C &=~(1<<1);//清零操作
#else
//打开GPIOB端口的时钟
RCC_APB2ENR |=((1)<<3);
//配置IO口为输出
GPIO_CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
GPIO_CRL |=((1)<<(4*1));
//控制ODR寄存器 PB1
while(1)
{
GPIO_ODR &=~(1<<1); //亮
delay(500000);
GPIO_ODR &=~(0<<1);//灭
delay(500000);
}
#endif
}
void SystemInit(void)//start_stm32f10x_hd.s中启动汇编时调用了SystemInit
{
}
不知道哪里有问题,编译无错误无警告,但烧入单片机中却仍只亮灯不闪烁。求解答。
作者:
gs0079
时间:
2019-7-15 20:47
没有运行那部分代码
作者:
cjm82
时间:
2019-7-16 00:47
建议还是用库函数吧,现在HAL库结合CUBE,一些基本的设置代码都是机器生成了,作为学习者重点只需要放在了解相关概念即可,花费大量精力去死记硬背这些东西根本不值得,我到现在,32最基本的配置个IO口,如果我不查资料不复制,就算使用库函数,直接用键盘敲估计我都敲不出来.更不要说配置其他的,但这根本不影响我使用32,只要我看看例程,我就知道我改哪里就能达到我需要的效果,然后直接复制即可,或者干脆整理下,下次直接#include,学习单片机,没有任何东西是需要死记硬背的,虽然学习的时候看下寄存器是好事,但是实际中,这种代码可读性太差了,不要说别人写的,就算自己写的,隔个几天再看也难看懂,就算要写寄存器风格的,起码也写在函数里,然后函数名用个一看就懂的名字(其实库函数也是这么干的),实际项目也远非点亮个LED这么简单.你试想你拿到几千上万行这种风格的代码会是如何感受?对于寄存器,当故事书一样,看一看即可.初学32,多半是51过来的,建议你试试把以前51的代码,移植过来,这既能帮你复习以前掌握的,又能对你初步了解32起一定帮助作用.
作者:
哈哈我哈哈
时间:
2019-7-16 09:01
cjm82 发表于 2019-7-16 00:47
建议还是用库函数吧,现在HAL库结合CUBE,一些基本的设置代码都是机器生成了,作为学习者重点只需要放在了解相 ...
嗯嗯好的,非常感谢您的回复!
作者:
yzwzfyz
时间:
2019-7-16 09:57
即然“程序无错”,就应该是天气不好,天运来了就好了。
作者:
2424113269
时间:
2019-7-16 10:13
抱歉,兄弟,我学的是库函数板,而且还没学几天
作者:
zeroL
时间:
2019-7-16 10:20
我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR。
void LED_Init(void) { RCC->APB2ENR|=1<<3; //使能 PORTB 时钟 RCC->APB2ENR|=1<<6; //使能 PORTE 时钟 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽输出 GPIOB->ODR|=1<<5; //PB.5 输出高 GPIOE->CRL&=0XFF0FFFFF; GPIOE->CRL|=0X00300000;//PE.5 推挽输出 GPIOE->ODR|=1<<5; //PE.5 输出高 }
作者:
伟宁咔咔
时间:
2019-7-16 11:00
GPIO_ODR &=~(1<<1); //亮 delay(500000); GPIO_ODR &=~(0<<1);//灭
作者:
伟宁咔咔
时间:
2019-7-16 11:00
GPIO_ODR &=~(1<<1); //亮
delay(500000);
GPIO_ODR &=~(0<<1);//灭
复制代码
这是什么鬼
作者:
哈哈我哈哈
时间:
2019-7-17 16:53
感谢各位,现已解决,附代码见下。
啊吐槽一句32果然比51复杂多了,配置寄存器真是脑壳疼。
#include "stm32f10x.h"//从底层学习
#include "stm32f10x_gpio.h"//从头文件中调用函数
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
//此为工程模版
int main (void)//亮蓝光
{
#if 0
//打开GPIOB端口的时钟
RCC_APB2ENR |=((1)<<3);
//配置IO口为输出
GPIO_CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
GPIO_CRL |=((1)<<(4*1));
//控制ODR寄存器 PB1
#elif 0
//打开GPIOB端口的时钟
RCC->APB2ENR |=((1)<<3);
//配置IO口为输出
GPIOB->CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
GPIOB->CRL |=((1)<<(4*1));//置1操作,10进制的1 0001
//控制ODR寄存器 PB1
GPIOB->ODR &=~(1<<1);//清零操作
#elif 1
GPIO_InitTypeDef GPIO_InitStructure;//变量定义位于函数开头,靠近大括号
// GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT_PP;
// GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
// //配置好后将这些值写入寄存器中 此时调用GPIO_Init函数
// GPIO_Init( GPIOB, &GPIO_InitStructure);//变量取地址用&
/*需要先打开时钟再配置IO口,否则无反应*/
//打开GPIOB端口的时钟
RCC->APB2ENR |=((1)<<3);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
//配置好后将这些值写入寄存器中 此时调用GPIO_Init函数
GPIO_Init( GPIOB, &GPIO_InitStructure);//变量取地址用&
//置位取1,灯灭
GPIO_SetBits(GPIOB,GPIO_Pin_5);//传入第一个形参GPIOB,5脚亮红光
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
while (1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delay(0xFFFF);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay(0xFFFF);
}
#endif
}
void SystemInit(void)//start_stm32f10x_hd.s中启动汇编时调用了SystemInit
{
//函数体为空,目的是为了骗过编译器不报错
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1