国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【試用報告】沁恒CH32V307評估板體驗:定時器使用基礎

電子發燒友論壇 ? 來源:未知 ? 2023-03-28 13:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

CH32V307系統提供了多個類型的定時器,具體可查看手冊了解:



這次的分享,我們使用到的定時器為系統時基定時器和基本定時器TIM6。


閃爍使用的LED,為LED1,使用連接線將LED1和PA0連接即可;實際運行時,間隔1秒閃爍一次。



有的同學可能會說,使用Delay_Ms或Delay_Us做演示,也能實現LED閃爍呀!


但在Delay的時候,你的程序,需要在這個地方,等待Delay時間后,才會繼續運行。


而使用中斷,我們的程序,能夠繼續運行做其他的事情,等到定時中斷到來的時候,才處理LED的閃爍。這樣程序的處理效率將會更高。


一、系統時基定時器SysTick


現在,我們了解一下系統時基定時器SysTick。


系統時基定時器:這是內核控制器自帶的一個 64 位可選遞增或遞減的計數器,用于產生 SYSTICK 異常(異常號:15),可專用于實時操作系統,為系統提供“心跳”節律,也可當成一個標準的 64 位計數器。具有自動重加 載功能及可編程時鐘源。


通過查看提供的實例和資料,了解到如下的關鍵信息:


1、系統的運行頻率可以工作在72MHz,也可以工作在144MHz,通過system_ch32v30x.h/system_ch32v30x.c來修改:

// #define SYSCLK_FREQ_72MHz 72000000
#define SYSCLK_FREQ_144MHz 144000000

(左右移動查看全部內容)


在我的實例中,設置工作在144MHz。


2、在設置SysTick的時候,通過SysTick->CMP來設置定時中斷周期:SysTick->CMP = SystemCoreClock / 1000 * 1000; //后面的1000代表1000HZ(那就是1ms進一次中斷),*1000 表示 1000ms進入一次


3、有人會遇到,中斷只進入一次,經過請教沁恒的陶工,了解到如下處理方法:

// 中斷只進入一次的問題解決方法:
// 1. 如果使用沁恒提供的工具鏈,則使用如下的聲明:
// void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
// 2. 如果使用通用的risc-v工具鏈,如我在macOS下使用賽昉提供的工具鏈,則使用如下的聲明:
void SysTick_Handler(void) __attribute__((interrupt()));

(左右移動查看全部內容)


最終,具體的代碼如下:

/*
使用VTF IRQ中斷控制LED閃爍
*/


#include "debug.h"
#include "board.h"


// 中斷只進入一次的問題解決方法:
// 1. 如果使用沁恒提供的工具鏈,則使用如下的聲明:
// void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
// 2. 如果使用通用的risc-v工具鏈,如我在macOS下使用賽昉提供的工具鏈,則使用如下的聲明:
void SysTick_Handler(void) __attribute__((interrupt()));


// LED狀態
volatile uint16_t LED_Status = 0; // 中斷里使用的變量加 volatile 可當成全局變量


// 初始化 GPIO
void GPIO_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}


// 初始化 SysTick 定時器
void SysTick_init(void)
{
/*配置中斷優先級*/
NVIC_InitTypeDef NVIC_InitStructure = {0};
NVIC_InitStructure.NVIC_IRQChannel = SysTicK_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶占式優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//響應式優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStructure);


/*配置定時器*/
SysTick->CTLR= 0;
SysTick->SR = 0;
SysTick->CNT = 0;
SysTick->CMP = SystemCoreClock / 1000 * 1000; //后面的1000代表1000HZ(那就是1ms進一次中斷),*1000 表示 1000ms進入一次
SysTick->CTLR= 0xf;
}


int main(void)
{
/* Initialize board components. */
BOARD_SystemClock_Config();
BOARD_IOMUX_Init();
BOARD_Peripheral_Init();


GPIO_INIT(); // 初始化 GPIO
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置中斷控制器的優先級分組為 占優先級 2位 ,優先級2位。


USART_Printf_Init(115200);
printf("SystemClk:%drn", SystemCoreClock);
printf("Interrupt SysTick Testrn");


SysTick_init();
while (1)
{
}
}


// 中斷服務處理
void SysTick_Handler(void)
{
SysTick->SR = 0;
LED_Status = !LED_Status; // 將 LED 狀態值取反
GPIO_WriteBit(GPIOA, GPIO_Pin_0, LED_Status); // 配置 PA0 (即 LED1) 狀態


printf("Toggle LED by SysTick: %drn", LED_Status);
}

(左右移動查看全部內容)


在上述代碼中,關鍵部分如下:

  • GPIO_INIT:初始化GPIO,使用PA0;記得預先連接LED1和PA0

  • SysTick_init:SysTick初始化,主要設置中斷周期

  • SysTick_Handler:中斷服務處理,其內部的操作需要狠準快

除了板載的LED1(前提是連好了線)會間隔1秒閃爍一次,通過串口工具,我們也可以看到輸出的調試信息:



二、基本定時器TIM6


然后,我們再來了解一下基本定時器。


基本定時器:基本定時器是一個 16 位自動裝載計數器,支持 16 位可編程預分頻器。可以位數模轉換(DAC)提供時鐘,觸發 DAC 的同步電路。基本定時器之間是互相獨立的,互不共享任何資源。


CH32V307提供了兩個基本定時器TIM6和TIM7,用法是一樣的,下面的實例中,使用TIM6。


通過官方提供的實例和資料了解到,基本定時器使用的過程中,有兩個設置是最重要的:

  • TIM_Prescaler:定時器預分頻器設置,時鐘源經該預分頻器才是定時器時鐘。

  • TIM_Period:定時器周期,實際就是設定自動重載寄存器的值。


這兩個參數結合就能實現實際所需要的定時。


根據定時器時鐘的頻率,比如時鐘的頻率是144MHz,可以理解為1秒鐘MCU會自己數144M次,預分頻系數就是將頻率分割,比如分頻系數是144,則該時鐘的頻率會變成144MHZ/144=1MHz,但是在設置的時候要注意,數值應該是144-1。


為了讓 LED1間隔 1 秒閃爍一次,我們需要讓定時器 1 秒溢出,要計數 144M * 1 = 144M 個時鐘周期,而定時器只有16位,最大65535,所以這是不夠的。因此,需要用到預分頻器,設分頻系數為 14400,可以得到 10KHz 的定時器時鐘,這樣設置計數值 10000 就可以做到 1s 定時。


最終具體的代碼如下:

/*
使用基本定時器TIM6控制LED閃爍
*/


#include "debug.h" // 包含 CH32V307 的頭文件,C 標準單元庫和delay()函數
#include "board.h"


// 中斷只進入一次的問題解決方法:
// 1. 如果使用沁恒提供的工具鏈,則使用如下的聲明:
// void TIM6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
// 2. 如果使用通用的risc-v工具鏈,如我在macOS下使用賽昉提供的工具鏈,則使用如下的聲明:
void TIM6_IRQHandler(void) __attribute__((interrupt()));


// LED狀態
volatile uint16_t LED_Status = 0; // 中斷里使用的變量加 volatile 可當成全局變量


// 初始化 GPIO
void GPIO_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}


// 初始化定時器 TIM6
void TIM6_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);


TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStructure);


TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_ARRPreloadConfig(TIM6, ENABLE);
TIM_Cmd(TIM6, ENABLE);
}


// 初始化定時器中斷
void Interrupt_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure = {0};
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


int main(void)
{
/* Initialize board components. */
BOARD_SystemClock_Config();
BOARD_IOMUX_Init();
BOARD_Peripheral_Init();


GPIO_INIT(); // 初始化 GPIO
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置中斷控制器的優先級分組為 占優先級 2位 ,優先級2位。


USART_Printf_Init(115200);


TIM6_Init(10000 - 1, 14400 - 1); // 初始化定時器,讓 LED 1 秒閃爍一次,我們需要讓定時器 1 秒溢出,要計數 `144M * 1 = 144M` 個時鐘周期,而定時器只有16位,這是不夠的。需要用到預分頻器,設分頻系數為 14400,可以得到 10KHz 的定時器時鐘,這樣設置計數值 10000 就可以做到 1s 定時。
Interrupt_Init(); //初始化定時器中斷


printf("SystemClk:%drn", SystemCoreClock);
printf("Interrupt TIM6 Testrn");


while (1)
{
}
}


// 中斷服務處理
void TIM6_IRQHandler(void)
{
TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除標志位
LED_Status = !LED_Status; // 將 LED 狀態值取反
GPIO_WriteBit(GPIOA, GPIO_Pin_0, LED_Status); // 配置 PE11 (即 LED1) 狀態


printf("Toggle LED by TIM6: %drn", LED_Status);
}

(左右移動查看全部內容)


在上述代碼中,關鍵部分如下:

  • GPIO_INIT:初始化GPIO,使用PA0;記得預先連接LED1和PA0

  • TIM6_init:TIM6初始化,主要設置分頻和時間周期

  • Interrupt_Init:終端初始化

  • TIM6_IRQHandler中斷服務處理,其內部的操作同樣需要狠準快


除了板載的LED1(前提是連好了線)會間隔1秒閃爍一次,通過串口工具,我們也可以看到輸出的調試信息:






聲明本文由電子發燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。


更多熱點文章閱讀

  • 龍芯架構首款面向嵌入式應用的開發板,2K500開發應用實例

  • ARM架構國產MCU移植!國民技術N32系列開源移植樣例合集

  • RK3568!四核64位ARMv8.2A架構,匯聚編譯源碼及實戰樣例

  • OpenHarmony開源鴻蒙大賽作品集:基于RK2206開發板20+成熟應用案例!

  • 24Bit ADC高精度低功耗MCU 醫療級別設備參考設計(附上高精確算法+電路原理圖)


原文標題:【試用報告】沁恒CH32V307評估板體驗:定時器使用基礎

文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電子技術
    +關注

    關注

    19

    文章

    930

    瀏覽量

    60040
  • 電子發燒友論壇

    關注

    5

    文章

    198

    瀏覽量

    1665
  • ch32
    +關注

    關注

    0

    文章

    74

    瀏覽量

    1253

原文標題:【試用報告】沁恒CH32V307評估板體驗:定時器使用基礎

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    國產100M以太網PHY:CH182H2性能測試應用看這篇就夠了

    本文分享一款100M以太網PHY芯片,CH182H2。并分享基于官方的開發CH32V307V-EVT-R3來評估下這款芯片的應用,以及性能測試。具體的性能,參數,特點等可以參考數據手
    的頭像 發表于 02-14 20:56 ?2.9w次閱讀
    國產100M以太網PHY:<b class='flag-5'>沁</b><b class='flag-5'>恒</b><b class='flag-5'>CH</b>182H2性能測試應用看這篇就夠了

    智能電表方案MCU單片機CH32V307系列

    智能電表作為現代電網數據采集的關鍵設備,承擔著電能計量、用電監測與遠程管理的重要職能。其核心在于穩定、高效且功能豐富的控制單元。針對這一需求,英尚代理推出搭載MCU單片機CH32V307系列的智能電表解決方案,憑借其出色的互
    的頭像 發表于 01-12 17:12 ?650次閱讀
    智能電表方案MCU單片機<b class='flag-5'>CH32V307</b>系列

    RT-Thread Studio CH32V307工程,程序運行異常怎么解決?

    RT-Thread Studio CH32V307 工程歷程程序運行異常,官方的EVT歷程使用是OK的,沒人維護嗎?
    發表于 10-13 06:36

    【作品合集】微電子CH585開發測評

    (一)【CH585開發免費試用體驗】CH585開發環境搭建(二)【
    發表于 09-08 10:38

    CH554評估資料包

    CH554評估說明及參考應用例程,包括USB設備、USB-Host、讀寫U盤文件、Touch-Key、Type-C、ADC、定時器、PWM、串口、SPI等例子。適用于:
    發表于 08-12 16:21 ?1次下載

    CH585開發免費試用體驗】定時器操作

    開發環境: IDE:MounRiver Studio MCU:CH585 1 定時器的工作原理 CH585定時器最基本功能是定時,可以設置不
    發表于 07-05 23:06

    CH585開發免費試用體驗】1、開箱評測

    MounRiver_Studio_Setup_V220.zip是基于vscode, MounRiver_Studio_Setup_V192.zip是基于eclipse。 由于之前使用了
    發表于 07-03 12:57

    CH585開發免費試用體驗】+品讀老朋友的新產品

    。 圖2 開發板正面 圖3 開發背面 在CH585 評估上配有的資源有: 開關 S1 :供電開關,用于切斷或連接外部 5V 供電或 U
    發表于 07-03 11:04

    CH585開發免費試用體驗】+開箱點燈篇

    一、引言 上周末收到官方寄過來的CH585M-R1開發,今天來分享一下,完成開箱以及環境搭建,并進行點燈入門操作。 CH585是集成B
    發表于 07-02 20:26

    CH585開發免費試用體驗】+開箱及開發環境準備

    首先感謝社區及廠家提供開發試用的機會,平時一直有關注的產品及RISC-V生態,雖然有嘗試過使用青稞RISC-
    發表于 06-27 21:44

    微電子:從互連互通應用推動RISC-V落地發展

    微電子邀您共襄盛舉微電子專注于連接技術和微處理器內核研究,基于多層次青稞RISC-V微處理器、多類型物理層收發器構建USB/藍牙/以
    的頭像 發表于 06-26 09:52 ?1581次閱讀
    <b class='flag-5'>沁</b><b class='flag-5'>恒</b>微電子:從互連互通應用推動RISC-<b class='flag-5'>V</b>落地發展

    CH32V303/305/307/317工業級通用微控制器數據手冊

    CH32V 系列是基于青稞 RISC-V 內核設計的工業級通用微控制器,包括 CH32V305 連接型 MCU、CH32V307/CH32V
    的頭像 發表于 05-15 17:37 ?2958次閱讀
    <b class='flag-5'>CH32V</b>303/305/<b class='flag-5'>307</b>/317工業級通用微控制器數據手冊

    使用RTT studio建立CH32V317的項目,無法使用以太網功能怎么辦?

    基于開發建立工程,以太網功能無法使用,猜測是不是還不支持CH32V317的芯片,因為開發用的是CH32V307
    發表于 04-30 08:29

    微藍牙轉接芯片系列解析:CH9140/CH9141/CH9142/CH9143

    微電子(WCH)推出的藍牙轉接芯片系列(CH9140、CH9141、CH9142、CH914
    的頭像 發表于 03-18 16:56 ?3003次閱讀
    <b class='flag-5'>沁</b><b class='flag-5'>恒</b>微藍牙轉接芯片系列解析:<b class='flag-5'>CH</b>9140/<b class='flag-5'>CH</b>9141/<b class='flag-5'>CH</b>9142/<b class='flag-5'>CH</b>9143

    國產芯片USB PHY芯片替代方案解析

    USB PHY芯片CH132系列的核心優勢分析
    的頭像 發表于 03-11 14:01 ?2386次閱讀
    國產芯片<b class='flag-5'>沁</b><b class='flag-5'>恒</b>USB PHY芯片替代方案解析