stm32流水灯实验

发布者:幸福的家园最新更新时间:2016-08-21 来源: eefocus关键字:stm32  流水灯实验 手机看文章 扫描二维码
随时随地手机看文章
test.c    包括3个头文件

#include "stm32f10x_lib.h"    stm32的一些库函数
#include "sys.h"    系统时钟初始化及一些延时函数
#include "led.h"     流水灯相关程序

=========================================================================

先看一下 stm32f10x_lib.h

里面又包括一个头文件   #include "stm32f10x_map.h"

接下来是类似

#ifdef _ADC
#include "stm32f10x_adc.h"
#endif /*_ADC */

#ifdef _BKP
#include "stm32f10x_bkp.h"
#endif /*_BKP */

#ifdef _CAN
#include "stm32f10x_can.h"
#endif /*_CAN */

........

#ifdef _GPIO                如果定义了_GPIO   则包含GPIO相关的头文件头                                    定义这些宏是在stm32f10x_conf.h中定义的

#include "stm32f10x_gpio.h"
#endif /*_GPIO */
.......

 

再看这个头文件 stm32f10x_map.h

   又包括几个头文件

   /* Includes ------------------------------------------------------------------*/
   #include "stm32f10x_conf.h"      类似 #define _GPIOA 宏定义
   #include "stm32f10x_type.h"   类似 typedef signed long s32; 的一些数据类型
   #include "cortexm3_macro.h"

 

stm32f10x_map.h定义了

/*------------------------ General Purpose and Alternate Function IO ---------*/
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
} GPIO_TypeDef;
类似的结构体

......

#define PERIPH_BASE           ((u32)0x40000000)

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)

然后来了重要的部分

#ifdef _GPIOC
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
#endif /*_GPIOC */

把从GPIOC_BASE 开始的内存强制类型转换成 GPIO_TypeDef 这种类型的结构体

在led.h 中这样调用 GPIOC->ODR=(GPIOC->ODR&~LED0)|(x ? LED0:0)

0x40011000 +12的地址赋值 ,即完成对相应寄存器的赋值

 

===================================================================

再看一下 sys.h 简单的寄存器赋值,对照手册看就很容易理解

//us延时函数 
void delay_us(unsigned int us)
{
u8 n;      
while(us--)for(n=0;n }
//ms延时函数
void delay_ms(unsigned int ms)
{
while(ms--)delay_us(1000); 
}

//把所有时钟寄存器复位
void RCC_DeInit(void)
{            
RCC->APB2RSTR = 0x00000000;//外设复位    
RCC->APB1RSTR = 0x00000000;      
RCC->AHBENR = 0x00000014; //flash时钟,闪存时钟使能.DMA时钟关闭   
RCC->APB2ENR = 0x00000000; //外设时钟关闭.      
RCC->APB1ENR = 0x00000000;   
RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                 
RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]      
RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP       
RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
RCC->CIR = 0x00000000;     //关闭所有中断
}

//外部8M,则得到72M的系统时钟 
void Stm32_Clock_Init(void)
{
unsigned char temp=0;
u8 timeout=0;
RCC_DeInit();
RCC->CR|=0x00010000; //外部高速时钟使能HSEON

timeout=0;
while(!(RCC->CR>>17)&&timeout<200)timeout++;//等待外部时钟就绪

//0-24M 等待0;24-48M 等待1;48-72M等待2;(非常重要!)    
FLASH->ACR|=0x32;//FLASH 2个延时周期

RCC->CFGR|=0X001D2400;//APB1/2=DIV2;AHB=DIV1;PLL=9*CLK;HSE作为PLL时钟源
RCC->CR|=0x01000000; //PLLON

timeout=0;
while(!(RCC->CR>>25)&&timeout<200)timeout++;//等待PLL锁定

RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02&&timeout<200)     //等待PLL作为系统时钟设置成功
{   
   temp=RCC->CFGR>>2;
   timeout++;
   temp&=0x03;

}

==============================================================================

led.h

#define LED0 (1<<10)// PC10
#define LED1 (1<<11)// PC11
#define LED2 (1<<12)// PC12    
#define LED3 (1<<2) // PD2 
               
#define LED0_SET(x) GPIOC->ODR=(GPIOC->ODR&~LED0)|(x ? LED0:0)
#define LED1_SET(x) GPIOC->ODR=(GPIOC->ODR&~LED1)|(x ? LED1:0)                 
#define LED2_SET(x) GPIOC->ODR=(GPIOC->ODR&~LED2)|(x ? LED2:0) 
#define LED3_SET(x) GPIOD->ODR=(GPIOD->ODR&~LED3)|(x ? LED3:0)
//LED IO初始化
void led_init(void)
{
RCC->APB2ENR|=1<<4;    //使能PORTC时钟    
GPIOC->CRH&=0XFFF000FF; 
GPIOC->CRH|=0X00033300;//PC.10/11/12推挽输出   
    GPIOC->ODR|=0X1C00;    //PC.10/11/12 输出高
RCC->APB2ENR|=1<<5;    //使能PORTD时钟
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X300;     //PD.2推挽输出
GPIOD->ODR|=1<<2;      //PD.2输出高 
}

关键字:stm32  流水灯实验 引用地址:stm32流水灯实验

上一篇:STM32的CAN波特率计算
下一篇:stm32问题:关于BOOT0和BOOT1

推荐阅读最新更新时间:2024-03-16 15:06

限量7折!米尔STM32MP135开发板
说到 MCU 就会想到 S MT32, 而 STM32MP1 作为新一代 MPU 的典范,有着极富开创意义的异构系统架构,兼容 MPU 和 MCU 的 双重优势,入门级、性价比高、能跑 L inux 系统、应用场景丰富 等 特点,深 受业界的喜爱! 米尔电子作为 ST 官方合作伙伴,先后开发了 S TM32MP151 、 S TM32MP157 、 STM32MP13 5 系列核心板和开发板,受到广大客户的认可。 米尔为了感谢广大客户的支持,推出 STM32MP1 35 开发板打折特惠活动! 米尔基于 STM32MP1 35 开发板 限 量 7 折! 7 折!
[嵌入式]
限量7折!米尔STM32MP135开发板
STM32GPIO的8种工作模式
一、推挽输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 二、开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点: 1、利用外部电
[单片机]
STM32GPIO的8种工作模式
关于STM32的GPIO配置不同输出速度会有什么影响
今天有人问:GPIO配置不同输出速度会有什么影响?你知道答案吗? 1写在前面 这个问题看起来比较简单,我相信很多人都能说出答案。 但是,很多人都只是停留在表面,至于深层次的含义,估计很少有人思考。 需要更深理解其中含义,可能需要结合特定场景来说,我自己也是在项目中才深刻体会其中含义。 2GPIO输出速度 不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。 类似如下: GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStru
[单片机]
关于<font color='red'>STM32</font>的GPIO配置不同输出速度会有什么影响
STM32 休眠模式下,难道 看门狗和低功耗模式没法同时使用?
在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独立的RC振荡器(STM32F10x一般为40kHz)提供,即使在主时钟出现故障时,也仍然有效,因此可以在停止和待机模式下工作。而且独立看门狗一旦启动,除了系统复位,它不能再被停止。但这样引发的一个问题是当MCU进入到低功耗模式后由于CPU停止运行无法喂狗,会导致系统频繁复位。那如何解决这个问题呢,难道独立看门狗和低功耗模式没法同时使用? 一个很好的方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完够在进入继续进入到休眠模式。比如看
[单片机]
STM32开发 -- VS2017错误
出现如下错误: error C3688: 文本后缀“L”无效;未找到文文本运算符或文本运算符模板“operator “”“”L” 解决方法:在字符串里加引号用 原来宏定义为: #define CN_ASSERT(E) ((E) ? true : CnComm::Assert(_T(“CN_ASSERT(“)_T(#E)_T(“) failed; CnComm(“)CN_LINE(LINE)_T(“); “))) 修改为: #define CN_ASSERT(E) ((E) ? true : CnComm::Assert(_T(“CN_ASSERT(”)_T(#E)_T(”) failed; CnComm(”)CN_
[单片机]
回炉重造STM32 CUBEMX之串口通讯问题四
串口通讯+PWM波:STM32F103C8T6通过USART1输入相应的指令控制的TIM3四个通道生成四个占空比不同的频率为50HzPWM波来控制云台。 之前用FT232直连单片机,一切正常返回的指令无乱码正常。 接上数传图传出现问题: 1、连续给出高电平时间持续1.5ms的指令,电机本该静止却会往一个方向慢慢漂移。怀疑每次在发出指令单片机相应指令的过程中会导致PWM波占空比变化。 2、接上数传后返回的指令中含有很多乱码。设备有时会莫名重启或者关闭。怀疑是发送的指令出现了偏差触发了开关机的指令。 3、设备返回的图像黑屏 解决方法: 1、对于重复发出的指令,设置相应的重复处理程序。若指令相同或者相同指令持续3次则跳
[单片机]
STM32写中断处理函数时,必须使用库函数,启动文件固定的函数名
中断名其所在位置为stm32fxxx.h中的IRQn_Type枚举中,比如 /** * @brief STM32F4XX Interrupt Number Definition, according to the selected device * in @ref Library_configuration_section */ typedef enum IRQn { /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ NonMaskableInt
[单片机]
如何利用定时器产生PWM波
摘要:利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形硬件:STM32F103C8T6核心板、示波器、串口调试助手所用到的的引脚为PA8和PA0。 测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,同时关闭计数器。因为知道了计数器计数一个数的时间,所以在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,通过这个值就知道一个脉冲的时间周期。时间周期的倒数就是外部信号的频率。 一、利用TIM1的CH1产生PWM波 pwm.c #include pwm.h voidTIM1_PWM_Init
[单片机]
如何利用定时器产生PWM波
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved