Stm32f103c8t6(proteus仿真)学习 您所在的位置:网站首页 proteus用不了为什么 Stm32f103c8t6(proteus仿真)学习

Stm32f103c8t6(proteus仿真)学习

2024-06-18 00:44| 来源: 网络整理| 查看: 265

目录 **一、proteus原理图绘制****二、定时器代码的编写****1. timer.c文件****2. timer.h头文件****3. main.c文件****4. 效果展示** **三、项目(代码+仿真)分享链接**

一、proteus原理图绘制

在这里插入图片描述 双击主控芯片 -> OSC Frequency 改成 72M 在这里插入图片描述

二、定时器代码的编写 1. timer.c文件

头文件

#include "timer.h" // Device header

定时器计数值的定义

extern uint16_t Time_Num ; //定时器计数值

定时器初始化函数

void Timer_Init(void){ //定时器初始化函数 //TIM_TimeBase的结构体定义,定义一个GPIO类型的结构体,名字为TIM_TimeBaseInitStructure TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //NVIC的结构体定义,定义一个NVIC类型的结构体,名字为NVIC_InitStructure NVIC_InitTypeDef NVIC_InitStructure; //开启定时器的时钟,注意是APB1(GPIO的是APB2) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //选择定时器的内部时钟源 TIM_InternalClockConfig(TIM2); //配置定时器时基单元:TIM_TimeBase //选择时钟分频,可以选择1分频、2分频和4分频 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_CKD_DIV1:1分频 //选择定时器计数方式,可选择向上计数、向下计数、中心对齐计数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_CounterMode_Up:向上计数 /* 定时频率 = 72M/(PSC+1)(ARR+1) ,定时时间T=7200*10000/72M=1s 定时1s */ //设置ARR,即定时器周期:TIM_Period,取值0-65535 TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1; //设置PSC,即定时器预分频器的值:TIM_Prescaler,取值0-65535 TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //高级定时器才用的到,重复计算器,先用不上赋值为0 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //TIM_TimeBase初始化 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); //使能定时器 更新中断TIM_IT_Update TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//ENABLE使能 //选择NVIC的中断优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2组,抢占优先级2位,响应优先级2位 //一个项目只需选择一次NVIC的中断优先级分组,全项目通用 /* 分组 抢占优先级 响应优先级 0 0位(取值为0) 4位(取值为0-15) 1 1位(取值为0-1) 3位(取值为0-7) 2 2位(取值为0-3) 2位(取值为0-3) 3 3位(取值为0-7) 1位(取值为0-1) 4 4位(取值为0-15) 0位(取值为0) */ //配置NVIC //选择中断源,定时器2的中断源名字是:TIM2_IRQn NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; 使能中断源 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //设置抢占优先级(中断优先级分组为2组,抢占优先级2位,取值0-3) NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置响应优先级(中断优先级分组为2组,响应优先级2位,取值0-3) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //初始化NVIC NVIC_Init(&NVIC_InitStructure); //定时器TIM2使能 TIM_Cmd(TIM2, ENABLE); }

定时器中断函数

//中断函数名字固定,定时器2的中断函数名字是:TIM2_IRQHandler void TIM2_IRQHandler(void){ //定时器中断函数 //获取TIM2 更新中断TIM_IT_Update 的中断标志位 if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //如果更新中断TIM_IT_Update 的中断标志位 == SET { Time_Num ++; //定时器的计数 //清除 更新中断TIM_IT_Update 的中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } 2. timer.h头文件 #ifndef __TIMER_H #define __TIMER_H #include "stm32f10x.h" // Device header #include "delay.h" void Timer_Init(void); void TIM2_IRQHandler(void); #endif 3. main.c文件 #include "stm32f10x.h" #include "OLED.h" #include "timer.h" #include "delay.h" uint16_t Time_Num =0 ; //定时器中断的计数值 int main(void) { delay_init(); OLED_Init(); Timer_Init(); OLED_ShowString(2,1,"Time_Num:"); //定时器中断TIM while(1){ OLED_ShowNum(2, 10, Time_Num , 5); } } 4. 效果展示

定时器中断每1s中断一次,计数值加1 在这里插入图片描述

三、项目(代码+仿真)分享链接

百度网盘 链接:https://pan.baidu.com/s/1pcVtAcER2mAwnQnyRL3aXQ 提取码:p8q4



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有