日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32c语言写数码管定时器,使用TIM1产生1秒定时控制数码管显示0-9(STM32_10)

發布時間:2025/3/11 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32c语言写数码管定时器,使用TIM1产生1秒定时控制数码管显示0-9(STM32_10) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、項目配置

1、新建項目文件夾"TimSeg";

2、通過Keil5創建新項目,保存在所創建的文件夾中(設項目名為pTimSeg),選擇MCU芯片為"STM32F103ZE"(本程序使用的硬件為:STM32-PZ6806L開發板)

3、在"TimSeg"文件夾下新建"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"文件夾。

① 在"CMSIS"文件夾中復制"core_cm3.h"和"core_cm3.c"文件;

② 在" Device "文件夾中復制"stm32f10x.h"、"system_stm32f10x.h"和"system_stm32f10x.c"文件;

③ 在" Startup "文件夾中復制"startup_stm32f10x_hd.s"文件;

④在"Lib"文件夾中新建"inc"和"src"兩個子文件夾,在"inc"文件夾中復制"misc.h"、"stm32f10x_gpio.h"、"stm32f10x_tim.h"和"stm32f10x_rcc.h"文件;在"src"文件夾中復制"misc.c"、"stm32f10x_gpio.c"、"stm32f10x_tim.c"和"stm32f10x_rcc.c"文件;

4、為項目添加"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"組,并將上述C程序文件和"startup_stm32f10x_hd.s"啟動文件加入到相應組中。

5、打開“項目配置”對話框,在"Output"選項卡中選擇"Create HEX File",在"C/C++"選項卡中的"Include Paths"中添加如下包含路徑:".CMSIS;", ".Device;", ".Libinc;",".Public;"。

6、在"stm32f10x.h"中添加函數參數檢查宏

(參看:https://blog.csdn.net/fanxp66/article/details/80215090)

#ifdef? USE_FULL_ASSERT

/**

* @brief? 這個assert_param宏用于函數參數檢查

* @param? expr:如果expr是 false,就調用 assert_failed函數報告源文件名和

*? ? ? ? ?失敗的行號,如果expr是 true ,就返回一個空值

* @retval None

*/

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

/* Exported functions ------------------------------------------------------- */

void assert_failed(uint8_t* file, uint32_t line);

#else

#define assert_param(expr) ((void)0)

#endif /* USE_FULL_ASSERT */

7、新建一個文件(system.h),保存到"Public"文件夾中,內容為:

#ifndef __SYSTEM__H

#define __SYSTEM__H

#include "stm32f10x.h"

//定義位帶地址宏

#define BITBAND(addr,bitnum) ((addr&0xF0000000) + 0x02000000 + ((addr&0x000FFFFF)<<5) + (bitnum<<2))

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))

#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum))

//IO口地址映射

//數據輸出寄存器地址

#define GPIOA_ODR_Addr? ? ? ? ? (GPIOA_BASE + 12)

#define GPIOB_ODR_Addr (GPIOB_BASE + 12)

#define GPIOC_ODR_Addr (GPIOC_BASE + 12)

#define GPIOD_ODR_Addr? ? ? ? ? (GPIOD_BASE + 12)

#define GPIOE_ODR_Addr (GPIOE_BASE + 12)

#define GPIOF_ODR_Addr (GPIOF_BASE + 12)

#define GPIOG_ODR_Addr? ? ? ? ? (GPIOG_BASE + 12)

//數據輸入寄存器地址

#define GPIOA_IDR_Addr? (GPIOA_BASE + 12)

#define GPIOB_IDR_Addr? (GPIOB_BASE + 12)

#define GPIOC_IDR_Addr? (GPIOC_BASE + 12)

#define GPIOD_IDR_Addr? (GPIOD_BASE + 12)

#define GPIOE_IDR_Addr? ?(GPIOE_BASE + 12)

#define GPIOF_IDR_Addr? ?(GPIOF_BASE + 12)

#define GPIOG_IDR_Addr? (GPIOG_BASE + 12)

#endif

該文件定義了GPIO端口位帶操作的宏。

二、數碼管電路與使用配置

開發板上數碼管相關電路如下圖所示:

要使得數碼管正常顯示需要進過以下步驟:

1、使能GPIOC時鐘

2、配置GPIOC_0-GPIOC_7為推挽輸出,50MHz速度

3、通過庫函數操作控制輸出

4、實現過程

① 在上述配置的項目中添加"seg.h"和"seg.c"文件,保存在"User/Seg"文件夾下,"seg.h"文件的內容為:

#ifndef __SEG__H

#define __SEG__H

#include "system.h"

#include "stm32f10x_gpio.h"

#define SEGPORT GPIOC

#define SEG_RCCPORT RCC_APB2Periph_GPIOC

#define SEGPIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)

void Seg_Init(void);

#endif

"seg.c"文件的內容為:

#include "seg.h"

#include "stm32f10x_rcc.h"

void Seg_Init()

{

GPIO_InitTypeDef GPIOC_mode;

RCC_APB2PeriphClockCmd(SEG_RCCPORT, ENABLE);

GPIOC_mode.GPIO_Pin = SEGPIN;

GPIOC_mode.GPIO_Speed = GPIO_Speed_50MHz;

GPIOC_mode.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(SEGPORT, &GPIOC_mode);

}

void Show()

{

static u8 n=0;

u16 seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

GPIO_Write(SEGPORT, seg[n]);

n++;

n = n%10;

}

② 將"seg.c"文件添加到項目的"User"組中;

③ 將"./User/Seg"路徑添加到項目文件包含的配置路徑中(在"C/C++"選項卡中的"Include Paths"中)。

三、定時器TIM1配置

1、選擇定時器

使用定時器首先要選擇定時器,stm32f103zet6MCU芯片有8個定時器,其中TIM1和TIM8稱為高級定時器,TIM2-TIM5稱為通用定時器,TIM6和TIM7稱為基本定時器,這里選擇TIM1作為通用定時器功能使用。

2、計算定時器配置參數

在本程序中,想要通過TIM1進行1秒的定時,實現每秒鐘產生一次定時計數溢出中斷,然后在中斷函數中調用數碼管顯示輸出。由于系統初始化時鐘(調用SystemInit函數)后APB2總線上的時鐘為72MHz,本程序中TIM1的時鐘選擇為CK_INT,為72MHz,這個頻率進過預分頻和計數后得到1秒的定時,需要設置預分頻系數與定時計數值之積為72M,這里設置預分頻系數為7200,計數器計數值為10000。

3、計數器配置編程

① 使能TIM1時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE );

② 配置TIM1參數

typedef struct

{

uint16_t TIM_Prescaler;? ? ? ? ?/*預分頻系數. 取值0x0000-0xFFFF */

uint16_t TIM_CounterMode;? ? ? ?/*計數模式*/

uint16_t TIM_Period;? ? ? ? ? ? /*計數值 0x0000到 0xFFFF.? */

uint16_t TIM_ClockDivision;? ? ?/*!時鐘分割,用于數字濾波器*/

uint8_t TIM_RepetitionCounter;? /*重復次數,僅對TIM1和TIM8有意義.

} TIM_TimeBaseInitTypeDef;

計數模式定義:

#define TIM_CounterMode_Up? ? ? ? ? ? ? ? ?((uint16_t)0x0000)

#define TIM_CounterMode_Down? ? ? ? ? ? ? ?((uint16_t)0x0010)

#define TIM_CounterMode_CenterAligned1? ? ?((uint16_t)0x0020)

#define TIM_CounterMode_CenterAligned2? ? ?((uint16_t)0x0040)

#define TIM_CounterMode_CenterAligned3? ? ?((uint16_t)0x0060)

時鐘分割

#define TIM_CKD_DIV1? ? ? ? ? ? ? ? ? ? ? ?((uint16_t)0x0000)

#define TIM_CKD_DIV2? ? ? ? ? ? ? ? ? ? ? ?((uint16_t)0x0100)

#define TIM_CKD_DIV4? ? ? ? ? ? ? ? ? ? ? ?((uint16_t)0x0200)

程序如下:

TIM_TimeBaseInitTypeDef? TIM_TimeBaseStructure;? ? ? //定義配置結構體變量

TIM_TimeBaseStructure.TIM_Prescaler = (7200– 1);

TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_Period = (10000 –1);

TIM_TimeBaseStructure.TIM_ClockDivision =0;

TIM_TimeBaseStructure.TIM_RepetitionCounter= 0;

TIM_TimeBaseInit( TIM1,&TIM_TimeBaseStructure);

③ 設置定時器中斷類型,并使能。

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

④ 開啟計數器,開始計數

TIM_Cmd( TIM1, ENABLE);

4、實現步驟

① 在上述配置的項目中添加"tim.h"和"tim.c"文件,保存在"User/Tim"文件夾下,"tim.h"文件的內容為:

#ifndef __TIM__H

#define __TIM__H

#include "system.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_tim.h"

void Init_Tim(void);

#endif

"tim.c"文件內容為:

#include "tim.h"

void Tim_Init(void)

{

TIM_TimeBaseInitTypeDef? TIM_TimeBaseStructure;? ? ?//定義配置結構體變量

RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );//使能定時器TIM1時鐘

TIM_TimeBaseStructure.TIM_Prescaler = (7200-1);

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_Period = (10000-1);

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit( TIM1, &TIM_TimeBaseStructure);

TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清除TIM1溢出中斷標志

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//打開溢出中斷

TIM_Cmd( TIM1, ENABLE);? ? ? ?//啟動定時器

}

② 將"tim.c"文件添加到項目的"User"組中;

③ 將"./User/Tim"路徑添加到項目文件包含的配置路徑中(在"C/C++"選項卡中的"Include Paths"中)。

四、NVIC配置和中斷函數

1、配置中斷分組(NVIC)

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

2、使能中斷

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn;? ? ?//定時器1上溢中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;? ? ? ?//主優先級

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;

NVIC_Init( & NVIC_InitStructure);

3、實現步驟

① 在上述配置的項目中添加"nvic.h"和"nvic.c"文件,保存在"User/Nvic"文件夾下,"nvic.h"文件的內容為:

#ifndef __NVIC__H

#define __NVIC__H

#include "stm32f10x.h"

#include "misc.h"

void My_NVIC_Init(void);

#endif

"nvic.c"文件內容為:

#include "nvic.h"

void My_NVIC_Init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );

NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;? ? ?//定時器TIM1上溢中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主優先級

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init( & NVIC_InitStructure);

}

② 將"nvic.c"文件添加到項目的"User"組中;

③ 將"./User/Nvic"路徑添加到項目文件包含的配置路徑中(在"C/C++"選項卡中的"Include Paths"中)。

五、主函數和終端服務函數

在main.c中添加中斷服務函數TIM1_UP_IRQHandler,修改主函數,內容如下:

#include "seg.h"

#include "tim.h"

#include "nvic.h"

int main()

{

Seg_Init();

My_NVIC_Init();

Tim_Init();

Show();

while(1)

[1] [2]

總結

以上是生活随笔為你收集整理的stm32c语言写数码管定时器,使用TIM1产生1秒定时控制数码管显示0-9(STM32_10)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性生生活大片又黄又 | 久久久精品欧美 | 日本在线观看一区 | 伊人久久超碰 | 综合色久 | 在线h网站 | 网站在线观看你懂的 | 成人黄色免费看 | 日韩毛片在线观看 | 久久99精品国产.久久久久 | 国产a级黄色片 | 五月天久久婷婷 | 岛国大片在线 | 国产成人亚洲精品自产在线 | 亚洲精选一区二区三区 | 亚洲最大成人在线视频 | 欧美一区二区三区黄色 | 久久精品午夜 | 91国内揄拍国内精品对白 | 久久电影一区二区 | 亚洲精品久久久久久久久久久久久 | 羞羞网站在线观看 | 大肉大捧一进一出好爽 | 久热亚洲| 国产精选视频在线观看 | 好吊操免费视频 | 操操操干干干 | 无码精品人妻一区二区三区漫画 | 91小仙女jk白丝袜呻吟 | 亚欧在线免费观看 | 青青青网 | 日韩视频第一页 | 别揉我奶头一区二区三区 | 高清一区在线观看 | 成人小视频免费在线观看 | 亚洲国产日韩在线一区 | 色婷婷中文字幕 | 国产色综合天天综合网 | 冈本视频在线观看 | 污网站免费观看 | 精品国产96亚洲一区二区三区 | 美女人人操 | 9999精品视频| 久久国产精品国产精品 | 久久人人爽人人爽 | 亚洲午夜久久久久久久久红桃 | 老熟妇精品一区二区三区 | 国产精品福利导航 | 亚洲视频精品在线 | 亚洲美女综合网 | www.日日干| 色哟哟导航 | 超碰美女在线 | 天天干天天色天天射 | 国产乱码一区二区三区在线观看 | 欧美一级专区 | 国产精品一区二区免费看 | 人妻少妇久久中文字幕 | 探花精品 | 乱淫的女高中暑假调教h | 中文字幕日韩专区 | 在线免费观看国产精品 | av免费观看在线 | 毛片一区二区三区 | 日韩欧美影院 | 色一情一交一乱一区二区三区 | 欧美裸体xxxx极品少妇 | 精品无码一区二区三区的天堂 | 一区三区在线观看 | av福利在线观看 | 午夜视频1000| 中文字幕影片免费在线观看 | 成人毛片a | 国产又粗又猛又黄视频 | 久久国产剧情 | 亚洲乱码一区二区三区 | 日本伊人色 | 青苹果av| 91在线观看视频网站 | 久久艹这里只有精品 | 丰满大乳少妇在线观看网站 | 国产亚洲视频在线观看 | av四虎| 91网页版 | 日韩国产亚洲欧美 | 51调教丨国产调教视频 | 成人免费影院 | 日本草逼视频 | 香港三日本8a三级少妇三级99 | 久久久久九九九 | 国产区视频 | 夜操操| av黄色国产 | 99久久99 | 亚洲av无码一区二区乱子伦as | 淫片aaa| 福利国产片 | 精品久久久久久无码人妻 | 国产视频久久久久 |