呼吸灯的实现

#include <stm32f4xx.h>

int BreathFlag;
int BreathAdd;


#define GPIO_Pin_6                 0x0040  /* LED1 */
#define GPIO_Pin_7   0x0080  /* LED2 */


#define PLL_M 8
#define PLL_N 336
#define PLL_P 2
#define PLL_Q 7


#define GPIO_AFRL6_AF3 ((uint32_t)0x03000000)
#define TIM_CCMR1_OC1M_3 ((uint32_t)0x0060)


void RCC_config(void);
void TIMER_config(void);
void NVIC_config(void);
void GPIO_config(void);


int main()
{
RCC_config();
GPIO_config();
TIMER_config();
NVIC_config();

while(1)
{
;
}
}

// 中断函数
void TIM1_UP_TIM10_IRQHandler(void)
{  
// 中断判断
if((TIM10->SR&TIM_SR_UIF)){
// 清除标志位
CLEAR_BIT(TIM10->SR, TIM_SR_UIF);
if(BreathAdd == 1000){
BreathFlag = 1;
}
if(BreathAdd == 0){
BreathFlag = 0;
}
if(BreathFlag){
BreathAdd--;
}else{
BreathAdd++;
}
// 设置CCR1值,即改变占空比
TIM10->CCR1 = BreathAdd;
}

void RCC_config(void)
{
// -------------------- 配置HSE时钟 -------------------- 
// 配置PLL预分频
RCC->PLLCFGR = 0x00000000;  // 将该寄存器默认值初始化为零
RCC->PLLCFGR |= PLL_M;
RCC->PLLCFGR |= PLL_N<<6;
RCC->PLLCFGR |= (PLL_P/2-1)<<16;
RCC->PLLCFGR |= PLL_Q<<24;
// 打开HSE晶振
SET_BIT(RCC->CR, RCC_CR_HSEON);
// 等待HSE晶振进入稳定状态
while(!(RCC->CR&RCC_CR_HSERDY)){
;
}
// 配置AHB预分频
SET_BIT(RCC->CFGR, RCC_CFGR_HPRE_DIV1);
// 配置APB1预分频,得到84M的时钟频率
SET_BIT(RCC->CFGR, RCC_CFGR_PPRE1_DIV4);
// 配置APB2预分频
SET_BIT(RCC->CFGR, RCC_CFGR_PPRE2_DIV2);
// 将HSE作为PLLCLK的输入
SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC_HSE);
// 使能PLLCLK
SET_BIT(RCC->CR, RCC_CR_PLLON);
// 等待PLLCLK稳定
while(!(RCC->CR&RCC_CR_PLLRDY)){
;
}
// 正确设置FLASH延迟时间
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
// 检查设置是否成功
if((FLASH->ACR & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_5WS){
;
}
// 将PLLCLK作为SYSCLK,关闭HSI
SET_BIT(RCC->CFGR, RCC_CFGR_SW_PLL);
CLEAR_BIT(RCC->CR, RCC_CR_HSION);
// 等待设置成功
while((RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL){
;
}
}


void TIMER_config(void)
{
// -------------------- 配置定时器 -------------------- 
// 打开TIM10时钟
RCC->APB2ENR |= RCC_APB2ENR_TIM10EN;
// 设置预分频值,对84M进行84分频,得到1M的计数器时钟频率  
TIM10->PSC = 83;
// 设置自动重载值,定时器周期为1ms
TIM10->ARR = 1000;
// 设置计数模式,向上计数
CLEAR_BIT(TIM10->CR1, TIM_CR1_DIR);
// 设置时钟分割
TIM10->CR1 |= TIM_CR1_CKD_0;
// 清空计数器的值
TIM10->CNT = 0;
// 重新初始化计数器,生成更新事件
TIM10->EGR |= TIM_EGR_UG;
// 将CC1配置成PWM模式1
TIM10->CCMR1 |= TIM_CCMR1_OC1M_3; 
// PWM波低电平有效
TIM10->CCER |= TIM_CCER_CC1P;
// CC1输出使能
TIM10->CCER |= TIM_CCER_CC1E;
// CC1的初始占空比为100%
TIM10->CCR1 = 1000;
// 中断使能
TIM10->DIER |= TIM_DIER_UIE;
// 自动重装载预装载使能(将TIM10_ARR的预设值导入)
TIM10->CR1 |= TIM_CR1_ARPE;
// 打开定时器10
TIM10->CR1 |= TIM_CR1_CEN;
}


void NVIC_config(void)

// TIM10全局中断
NVIC->ISER[0] |= 1<<25;


}


void GPIO_config(void)
{
// -------------------- 配置GPIO -------------------- 
// 打开G端口的时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
// Pin_7为输出模式,Pin_6为复用功能模式
GPIOF->MODER |= GPIO_MODER_MODER6_1;
GPIOF->MODER |= GPIO_MODER_MODER7_0;
// 有上拉电阻,开漏输出
GPIOF->OTYPER |= GPIO_OTYPER_OT_6;
GPIOF->OTYPER |= GPIO_OTYPER_OT_7;
// 中等速度
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_0;
GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_0;
// 不拉高不拉低
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR6;
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR7;
// 复用功能选择
GPIOF->AFR[0] |= GPIO_AFRL6_AF3;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于呼吸的C语言编程Options 1,0,0 // Target 'Target 1' Device (AT89C51) Vendor (Atmel) Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)) FlashUt () StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code")) FlashDR () DevID (2976) Rgf (REGX51.H) Mem () C () A () RL () OH () DBC_IFX () DBC_CMS () DBC_AMS () DBC_LMS () UseEnv=0 EnvBin () EnvInc () EnvLib () EnvReg (Atmel\) OrgReg (Atmel\) TgStat=16 OutDir (.\) OutName (a9) GenApp=1 GenLib=0 GenHex=1 Debug=1 Browse=1 LstDir (.\) HexSel=0 MG32K=0 TGMORE=0 RunUsr 0 0 RunUsr 1 0 BrunUsr 0 0 BrunUsr 1 0 SVCSID MODEL5=0 RTOS5=0 ROMSZ5=2 DHOLD5=0 XHOLD5=0 T51FL=80 XT51FL=0 CBANKS5=0 XBANKS5=0 RCB51 { 0,0,0,0,0,0,0,1,0 } RXB51 { 0,0,0,0,0,0,0,0,0 } OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IRO51 { 1,0,0,0,0,0,16,0,0 } IRA51 { 0,0,0,0,0,128,0,0,0 } XRA51 { 0,0,0,0,0,0,0,0,0 } XRA512 { 0,0,0,0,0,0,0,0,0 } IROM512 { 0,0,0,0,0,0,0,0,0 } C51FL=21630224 C51VA=0 C51MSC () C51DEF () C51UDF () INCC5 () AX51FL=4 AX51MSC () AX51SET () AX51RST () INCA5 () PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IncBld=1 AlwaysBuild=0 GenAsm=0 AsmAsm=0 PublicsOnly=0 StopCode=3 CustArgs () LibMods () BankNo=65535 LX51FL=292 LX51OVL () LX51MSC () LX51DWN () LX51LFI () LX51ASN () LX51RES () LX51CCL () LX51UCL () LX51CSC () LX51UCS () LX51COB () LX51XDB () LX51PDB () LX51BIB () LX51DAB () LX51IDB () LX51PRC () LX51STK () LX51COS () LX51XDS () LX51BIS () LX51DAS () LX51IDS () OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51) OPTDBG 48125,-1,()()()()()()()()()() ()()()() FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 } FLASH2 () FLASH3 () FLASH4 () EndOpt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值