5 Commits

Author SHA1 Message Date
YuanHongbin b66d23cc6a fix: 升级开始时设置AppFlag为APP_BOOT_UPGRADE_FLAG,更新Keil调试器配置 2026-08-19 17:02:38 +08:00
YuanHongbin 8ded5ca0dc chore: 源码编码GB2312统一转换为UTF-8
18个含有中文注释的.c/.h文件从GB2312转为UTF-8(无BOM)
2026-07-20 14:27:38 +08:00
YuanHongbin aef9d4effe feat: boot升级后通知APP擦除外部Flash
升级开始时设置 AppFlag=APP_BOOT_UPGRADE_FLAG 写入BINFO_BASE

升级完成后不再清零 AppFlag,供APP启动时检测

dev_boot.h 新增 APP_BOOT_UPGRADE_FLAG(0x5A5A55A5) 定义
2026-07-14 17:24:52 +08:00
YuanHongbin 74960e18ff 1、恢复CRC32校验判断 2026-06-22 09:57:28 +08:00
YuanHongbin 67fc98f998 1、删除了crc校验判断 2026-05-21 11:23:06 +08:00
20 changed files with 217 additions and 250 deletions
+4 -3
View File
@@ -47,7 +47,7 @@ static void update_on_start( uint8_t* frame, int len, uint8_t* pload, int size)
{
update_protocol_req_t* pReq = (void *)&frame[sizeof(update_protocol_hd_t)];
g_update.cfg.AppFlag = 0;
g_update.cfg.AppFlag = APP_BOOT_UPGRADE_FLAG;
g_update.cfg.UpdateFlag = APP_UPDATE_FLAG;
g_update.cfg.Crc32Check = pReq->AppCrc32;
g_update.cfg.PackageNum = pReq->PackageNum;
@@ -84,7 +84,6 @@ static void update_on_download(uint8_t* frame, int len, uint8_t* pload, int size
if (crc_rom == g_update.cfg.Crc32Check)
{
g_update.cfg.AppFlag = 0;
g_update.cfg.UpdateFlag = 0;
g_update.cfg.PackageNum = 0;
@@ -188,6 +187,8 @@ int app_update_entry(struct pt *pt)
if (g_update.cfg.UpdateFlag == APP_UPDATE_FLAG)
{
g_update.isNeedUpdate = 1;
g_update.cfg.AppFlag = APP_BOOT_UPGRADE_FLAG;
dev_boot_write_param(g_update.cfg);
}
else
{
@@ -217,7 +218,7 @@ int app_update_entry(struct pt *pt)
update_init(send_bytes);
//²Á³ýAPP
//擦除APP
if ((g_update.cfg.UpdateFlag == APP_UPDATE_FLAG)
&& dev_boot_check_app()
){
+1 -1
View File
@@ -9,7 +9,7 @@
#include "hdl_clk.h"
/*******************************************************************************
* ÖжϷþÎñº¯Êý
* 中断服务函数
******************************************************************************/
void SysTick_Handler(void)
{
+5 -38
View File
@@ -88,14 +88,14 @@
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tLdApp>0</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>0</tRtrace>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
@@ -125,7 +125,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM)</Name>
<Name>-U12345678 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -158,40 +158,7 @@
<Name>-T0</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>40</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>11242</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\App\main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\boot\../App/main.c\40</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>36</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>11236</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\App\main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\boot\../App/main.c\36</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
@@ -238,7 +205,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
+18 -18
View File
@@ -1,5 +1,5 @@
/******************************************************************************
* @brief 环形缓冲区管理(参考linux/kfifo)
* @brief 环形缓冲区管理(参考linux/kfifo)
*
* Copyright (c) 2016~2020, <morro_luo@163.com>
*
@@ -7,7 +7,7 @@
*
* Change Logs:
* Date Author Notes
* 2016-05-30 Morro 初版完成
* 2016-05-30 Morro 初版完成
******************************************************************************/
#include "ringbuffer.h"
#include <string.h>
@@ -16,10 +16,10 @@
#define min(a,b) ( (a) < (b) )? (a):(b)
/*
*@brief 构造一个空环形缓冲区
*@param[in] r - 环形缓冲区管理器
*@param[in] buf - 数据缓冲区
*@param[in] len - buf长度(必须是2的N次幂)
*@brief 构造一个空环形缓冲区
*@param[in] r - 环形缓冲区管理器
*@param[in] buf - 数据缓冲区
*@param[in] len - buf长度(必须是2的N次幂)
*@retval bool
*/
bool ring_buf_init(ring_buf_t *r,unsigned char *buf, unsigned int len)
@@ -31,8 +31,8 @@ bool ring_buf_init(ring_buf_t *r,unsigned char *buf, unsigned int len)
}
/*
*@brief 清空环形缓冲区
*@param[in] r - 待清空的环形缓冲区
*@brief 清空环形缓冲区
*@param[in] r - 待清空的环形缓冲区
*@retval none
*/
void ring_buf_clr(ring_buf_t *r)
@@ -41,8 +41,8 @@ void ring_buf_clr(ring_buf_t *r)
}
/*
*@brief 获取环形缓冲区数据长度
*@retval 环形缓冲区中有效字节数
*@brief 获取环形缓冲区数据长度
*@retval 环形缓冲区中有效字节数
*/
int ring_buf_len(ring_buf_t *r)
{
@@ -50,10 +50,10 @@ int ring_buf_len(ring_buf_t *r)
}
/*
*@brief 将指定长度的数据放到环形缓冲区中
*@param[in] buf - 数据缓冲区
* len - 缓冲区长度
*@retval 实际放到中的数据
*@brief 将指定长度的数据放到环形缓冲区中
*@param[in] buf - 数据缓冲区
* len - 缓冲区长度
*@retval 实际放到中的数据
*/
int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len)
{
@@ -70,10 +70,10 @@ int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len)
}
/*
*@brief 从环形缓冲区中读取指定长度的数据
*@param[in] len - 读取长度
*@param[out] buf - 输出数据缓冲区
*@retval 实际读取长度
*@brief 从环形缓冲区中读取指定长度的数据
*@param[in] len - 读取长度
*@param[out] buf - 输出数据缓冲区
*@retval 实际读取长度
*/
int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len)
{
+7 -7
View File
@@ -1,5 +1,5 @@
/******************************************************************************
* @brief 环形缓冲区管理(参考linux/kfifo)
* @brief 环形缓冲区管理(参考linux/kfifo)
*
* Copyright (c) 2016~2020, <morro_luo@163.com>
*
@@ -7,7 +7,7 @@
*
* Change Logs:
* Date Author Notes
* 2016-05-30 Morro 初版完成
* 2016-05-30 Morro 初版完成
******************************************************************************/
#ifndef _RING_BUF_H_
@@ -19,12 +19,12 @@
extern "C" {
#endif
/*环形缓冲区管理器*/
/*环形缓冲区管理器*/
typedef struct {
unsigned char *buf; /*环形缓冲区 */
unsigned int size; /*环形缓冲区 */
unsigned int front; /*头指针 */
unsigned int rear; /*尾指针 */
unsigned char *buf; /*环形缓冲区 */
unsigned int size; /*环形缓冲区 */
unsigned int front; /*头指针 */
unsigned int rear; /*尾指针 */
}ring_buf_t;
bool ring_buf_init(ring_buf_t *r,unsigned char *buf,unsigned int size);
+4 -4
View File
@@ -5,7 +5,7 @@
#define CRC16_BASE 0xA001
//帧头结构体
//帧头结构体
typedef struct {
uint8_t Header;
uint8_t SlvAddr;
@@ -13,20 +13,20 @@ typedef struct {
uint8_t PayloadLen;
}update_protocol_hd_t;
//主机下发升级请求载荷结构体
//主机下发升级请求载荷结构体
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
}__attribute__ ((packed))update_protocol_req_t;
//从机请求下发结构体
//从机请求下发结构体
typedef struct {
uint16_t PackageIndex;
uint32_t PackageNum;
}__attribute__ ((packed))update_protocol_get_t;
//主机应答下发数据结构体
//主机应答下发数据结构体
typedef struct {
uint16_t PackageIndex;
uint16_t PackageNum;
+1 -2
View File
@@ -5,6 +5,7 @@
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
#define APP_BOOT_UPGRADE_FLAG 0x5A5A55A5
#define BOOT_BASE (FLASH_BASE)
#define BOOT_SIZE (4*FLASH_SECTOR_SIZE)
@@ -15,8 +16,6 @@
#define BOOT_PARA_ADDRESS (APP_ADDRESS + APP_SIZE)
#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
typedef struct {
uint32_t AppFlag;
+29 -29
View File
@@ -1,11 +1,11 @@
#include "hdl_clk.h"
/********************************************************************************************************
* @函数名 hdl_xtal_init
* @描述 外部晶振初始化
* @参数
* @返回值 无
* @注意
* @鍑芥暟鍚? hdl_xtal_init
* @鎻忚堪 澶栭儴鏅舵尟鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
********************************************************************************************************/
#if USING_XTAL
@@ -13,11 +13,11 @@ static void hdl_xtal_init(void)
{
stc_clock_xtal_init_t stcXtalInit;
/* XTAL 引脚配置 */
/* XTAL 寮曡剼閰嶇疆 */
GPIO_AnalogCmd(GPIO_PORT_H, GPIO_PIN_00 | GPIO_PIN_01, ENABLE);
(void)CLK_XtalStructInit(&stcXtalInit);
/* 配置XTAL和启用XTAL */
/* 閰嶇疆XTAL鍜屽惎鐢╔TAL */
stcXtalInit.u8State = CLK_XTAL_ON;
stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
@@ -28,11 +28,11 @@ static void hdl_xtal_init(void)
/********************************************************************************************************
* @函数名 hdl_pll_init
* @描述 锁相环倍频初始化
* @参数
* @返回值 无
* @注意
* @鍑芥暟鍚? hdl_pll_init
* @鎻忚堪 閿佺浉鐜€嶉鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
********************************************************************************************************/
static void hdl_pll_init(void)
{
@@ -40,7 +40,7 @@ static void hdl_pll_init(void)
(void)CLK_PLLStructInit(&stcMPLLInit);
/* MPLL 配置 */
/* MPLL 閰嶇疆 */
/* 16MHz/M*N = 16/2*50/2 = 200MHz */
stcMPLLInit.PLLCFGR = 0UL;
stcMPLLInit.PLLCFGR_f.PLLM = (2UL - 1UL);
@@ -55,33 +55,33 @@ static void hdl_pll_init(void)
/********************************************************************************************************
* @函数名 hdl_clk_init
* @描述 时钟初始化
* @参数
* @返回值 无
* @注意
* @鍑芥暟鍚? hdl_clk_init
* @鎻忚堪 鏃堕挓鍒濆鍖?
* @鍙傛暟 鏃?
* @杩斿洖鍊? 鏃?
* @娉ㄦ剰 鏃?
********************************************************************************************************/
void hdl_clk_init(void)
{
/* 解除写保护 */
/* 瑙i櫎鍐欎繚鎶?*/
LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 设置时钟分频 */
/* 璁剧疆鏃堕挓鍒嗛 */
CLK_SetClockDiv(CLK_BUS_CLK_ALL, (CLK_HCLK_DIV1 | CLK_EXCLK_DIV2 | CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | \
CLK_PCLK2_DIV4 | CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2));
/* SRAM初始化包括读/写等待周期设置 */
/* SRAM鍒濆鍖栧寘鎷/鍐欑瓑寰呭懆鏈熻缃?*/
SRAM_SetWaitCycle(SRAM_SRAM_ALL, SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1);
SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0);
/* 闪存读取等待周期设置 */
/* 闂瓨璇诲彇绛夊緟鍛ㄦ湡璁剧疆 */
EFM_SetWaitCycle(EFM_WAIT_CYCLE5);
/* XTAL 初始化 */
/* XTAL 鍒濆鍖?*/
// hdl_xtal_init();
/* XTAL32 初始化 */
/* XTAL32 鍒濆鍖?*/
/* MPLL 初始化 */
/* MPLL 鍒濆鍖?*/
hdl_pll_init();
/* enable LRC */
@@ -90,7 +90,7 @@ void hdl_clk_init(void)
/* 3 cycles for 126MHz ~ 200MHz */
GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
/* 切换驱动能力 */
/* 鍒囨崲椹卞姩鑳藉姏 */
PWC_HighSpeedToHighPerformance();
EFM_DataCacheResetCmd(ENABLE);
@@ -99,13 +99,13 @@ void hdl_clk_init(void)
/* Enable cache */
EFM_CacheCmd(ENABLE);
/* 使能写保护 */
/* 浣胯兘鍐欎繚鎶?*/
LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_GPIO | LL_PERIPH_SRAM);
/* 设置系统时钟源 */
/* 璁剧疆绯荤粺鏃堕挓婧?*/
CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
/* 使能systick */
/* 浣胯兘systick */
(void)SysTick_Init(1000U);
}
+11 -11
View File
@@ -127,7 +127,7 @@ void hdl_cs5552_init(void)
SET_CS5552_CS();
/* 配置CS5552 */
/* 配置CS5552 */
CLR_CS5552_CS();
hdl_cs5552_write_read_byte(0x00);
hdl_cs5552_write_read_byte(0xA5);
@@ -143,32 +143,32 @@ void hdl_cs5552_init(void)
hdl_cs5552_reg_write(GAIN_CH0_W, 0x02, 0x00, 0x00, 0x00); //GAIN_CH0
hdl_cs5552_reg_write(OS_CH1_W, 0x00, 0x00, 0x00, 0x00); //OS_CH1
hdl_cs5552_reg_write(GAIN_CH1_W, 0x02, 0x00, 0x00, 0x00); //GAIN_CH1
hdl_cs5552_reg_write(CONV_CONF0_W, 0x30, 0x80, 0x00, 0x80); //CONV_CONF0 滤波-256CLK 速率-200Hz PGA-128
hdl_cs5552_reg_write(CONV_CONF0_W, 0x30, 0x80, 0x00, 0x80); //CONV_CONF0 滤波-256CLK 速率-200Hz PGA-128
hdl_cs5552_reg_write(CONV_CONF1_W, 0x00, 0x00, 0x00, 0x00); //CONV_CONF1
hdl_cs5552_reg_write(SYS_CONF0_W, 0x02, 0x01, 0x00, 0x00); //SYS_CONF0
hdl_cs5552_reg_write(SYS_CONF1_W, 0x08, 0x11, 0x02, 0x10); //SYS_CONF1 内部时钟 内部基准源
hdl_cs5552_reg_write(SYS_CONF1_W, 0x08, 0x11, 0x02, 0x10); //SYS_CONF1 内部时钟 内部基准源
hdl_cs5552_reg_write(SYS_CONF2_W, 0x00, 0x52, 0x10, 0x00); //SYS_CONF2
#ifdef HC32_DEBUG
/* 读取通道0设置 */
/* 读取通道0设置 */
data = hdl_cs5552_reg_read(OS_CH0_R);
printf("OS_CH0 = %d\r\n", data);
data = hdl_cs5552_reg_read(GAIN_CH0_R);
printf("GAIN_CH0 = %d\r\n", data);
/* 读取通道1设置 */
/* 读取通道1设置 */
data = hdl_cs5552_reg_read(OS_CH1_R);
printf("OS_CH1 = %d\r\n", data);
data = hdl_cs5552_reg_read(GAIN_CH1_R);
printf("GAIN_CH1 = %d\r\n", data);
/* 配置CONV */
/* 配置CONV */
data = hdl_cs5552_reg_read(CONV_CONF0_R);
printf("CONV_CONF0 = %d\r\n", data);
data = hdl_cs5552_reg_read(CONV_CONF1_R);
printf("CONV_CONF1 = %d\r\n", data);
/* 配置SYS */
/* 配置SYS */
data = hdl_cs5552_reg_read(SYS_CONF0_R);
printf("SYS_CONF0 = %d\r\n", data);
data = hdl_cs5552_reg_read(SYS_CONF1_R);
@@ -208,7 +208,7 @@ void hdl_cs5552_proc(void)
case CS5552_OFFSET_READ:
if(RESET == GET_CS5552_DOUT())
{
ad_value = hdl_cs5552_reg_read(0xFF); //获取数据
ad_value = hdl_cs5552_reg_read(0xFF); //获取数据
if((ad_value & 0x1) == 0)
{
@@ -220,7 +220,7 @@ void hdl_cs5552_proc(void)
cs5552.offset_ch1[offset_cnt] = (ad_value & 0xFFFFFFFE) | 0x0;
}
offset_cnt++;
cs5552.channel_sta = 1-cs5552.channel_sta; //切换通道
cs5552.channel_sta = 1-cs5552.channel_sta; //切换通道
cs5552.step = CS5552_OFFSET;
}
@@ -238,7 +238,7 @@ void hdl_cs5552_proc(void)
if(RESET == GET_CS5552_DOUT())
{
ad_value = hdl_cs5552_reg_read(0xFF); //获取数据
ad_value = hdl_cs5552_reg_read(0xFF); //获取数据
if((ad_value & 0x1) == 0)
{
@@ -256,7 +256,7 @@ void hdl_cs5552_proc(void)
cs5552.buf[1] = ~(0x7FFFF - ((ad_value & 0xFFFFFFFE) >> 13));
}
cs5552.channel_sta = 1-cs5552.channel_sta; //切换通道
cs5552.channel_sta = 1-cs5552.channel_sta; //切换通道
cs5552.step = CS5552_START;
}
+5 -5
View File
@@ -93,11 +93,11 @@ typedef enum
typedef struct
{
en_cs5552_step step; //流程
en_cs5552_ch channel_sta; //当前转换通道
int32_t buf[2]; //通道数据
uint32_t offset_ch0[OFFSET_CNT]; //通道0校准值
uint32_t offset_ch1[OFFSET_CNT]; //通道1校准值
en_cs5552_step step; //流程
en_cs5552_ch channel_sta; //当前转换通道
int32_t buf[2]; //通道数据
uint32_t offset_ch0[OFFSET_CNT]; //通道0校准值
uint32_t offset_ch1[OFFSET_CNT]; //通道1校准值
}stc_cs5552_t;
void hdl_cs5552_init(void);
+6 -6
View File
@@ -47,23 +47,23 @@ void hdl_encoder_init(void)
LL_PERIPH_WE(LL_PERIPH_GPIO);
/* 配置引脚 */
/* 配置引脚 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PullUp = PIN_PU_ON; //上拉输入
stcGpioInit.u16ExtInt = PIN_EXTINT_ON; //外部中断
stcGpioInit.u16PullUp = PIN_PU_ON; //上拉输入
stcGpioInit.u16ExtInt = PIN_EXTINT_ON; //外部中断
(void)GPIO_Init(ENCODER_SW_PORT, ENCODER_SW_PIN, &stcGpioInit);
(void)GPIO_Init(ENCODER_A_PORT, ENCODER_A_PIN, &stcGpioInit);
(void)GPIO_Init(ENCODER_B_PORT, ENCODER_B_PIN, &stcGpioInit);
/* 配置中断 */
/* 配置中断 */
(void)EXTINT_StructInit(&stcExtIntInit);
stcExtIntInit.u32Filter = EXTINT_FILTER_ON;
stcExtIntInit.u32FilterClock = EXTINT_FCLK_DIV8;
stcExtIntInit.u32Edge = EXTINT_TRIG_BOTH; //双边沿中断
stcExtIntInit.u32Edge = EXTINT_TRIG_BOTH; //双边沿中断
(void)EXTINT_Init(ENCODER_A_EX_CH, &stcExtIntInit);
(void)EXTINT_Init(ENCODER_B_EX_CH, &stcExtIntInit);
/* 配置中断源 */
/* 配置中断源 */
stcIrqSignConfig.enIntSrc = ENCODER_A_INT_SRC;
stcIrqSignConfig.enIRQn = ENCODER_A_INT_IRQn;
stcIrqSignConfig.pfnCallback = &hdl_encoder_a_callback;
+1 -1
View File
@@ -58,7 +58,7 @@ int32_t hdl_flash_unlock(void)
;
}
//½âËøEFM
//解锁EFM
EFM_FWMC_Cmd(ENABLE);
EFM_CacheCmd(ENABLE);
+1 -1
View File
@@ -53,7 +53,7 @@ extern "C"
/* Vector table */
#define VECT_TAB_STEP (0x000UL)
/* flash rom map ´æ´¢·ÖÇø*/
/* flash rom map 存储分区*/
//boot 16k
#define FLASH_BOOT_BASE (FLASH_BASE)
#define FLASH_BOOT_SIZE (4*FLASH_SECTOR_SIZE)
+39 -39
View File
@@ -39,9 +39,9 @@ void hdl_lcd_timer_config(void)
/* TIMER0 configuration */
(void)TMR0_StructInit(&stcTmr0Init);
stcTmr0Init.u32ClockSrc = TMR0_CLK_SRC_INTERN_CLK; //内部时钟
stcTmr0Init.u32ClockDiv = TMR0_CLK_DIV64; //2分频
stcTmr0Init.u32Func = TMR0_FUNC_CMP; //输出比较
stcTmr0Init.u32ClockSrc = TMR0_CLK_SRC_INTERN_CLK; //内部时钟
stcTmr0Init.u32ClockDiv = TMR0_CLK_DIV64; //2分频
stcTmr0Init.u32Func = TMR0_FUNC_CMP; //输出比较
stcTmr0Init.u16CompareValue = (uint16_t)LCD_TIME_CMP_VALUE;
(void)TMR0_Init(LCD_TIM_UINT, LCD_TIM_CH, &stcTmr0Init);
hdl_delay_ms(1U);
@@ -72,7 +72,7 @@ void hdl_lcd_config(void)
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 引脚设置 */
/* 引脚设置 */
GPIO_SetDebugPort(GPIO_PIN_TRST,DISABLE);
(void)GPIO_StructInit(&stcGpioInit);
@@ -87,7 +87,7 @@ void hdl_lcd_config(void)
(void)GPIO_Init(LCD_RES_PORT, LCD_RES_PIN, &stcGpioInit);
(void)GPIO_Init(LCD_DC_PORT, LCD_DC_PIN, &stcGpioInit);
/* SPI配置 */
/* SPI配置 */
FCG_Fcg1PeriphClockCmd(LCD_SPI_CLK, ENABLE);
SPI_StructInit(&stcSpiInit);
stcSpiInit.u32WireMode = SPI_3_WIRE;
@@ -101,14 +101,14 @@ void hdl_lcd_config(void)
stcSpiInit.u32FrameLevel = SPI_1_FRAME;
(void)SPI_Init(LCD_SPI_UINT, &stcSpiInit);
/* DMA配置 */
/* DMA配置 */
FCG_Fcg0PeriphClockCmd(LCD_DMA_CLK, ENABLE);
(void)DMA_StructInit(&stcDmaInit);
stcDmaInit.u32BlockSize = 1UL;
stcDmaInit.u32TransCount = 1;
stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT; //数据位宽
stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC; //源地址自增
stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX; //目标地址固定
stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT; //数据位宽
stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC; //源地址自增
stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX; //目标地址固定
stcDmaInit.u32SrcAddr = (uint32_t)(0);
stcDmaInit.u32DestAddr = (uint32_t)(&LCD_SPI_UINT->DR);
stcDmaInit.u32IntEn = DMA_INT_ENABLE;
@@ -116,9 +116,9 @@ void hdl_lcd_config(void)
for (;;) {
}
}
AOS_SetTriggerEventSrc(LCD_DMA_TX_TRIG_CH, LCD_SPI_TX_EVT_SRC); //DMA发送触发源
AOS_SetTriggerEventSrc(LCD_DMA_TX_TRIG_CH, LCD_SPI_TX_EVT_SRC); //DMA发送触发源
/* DMA 中断配置 */
/* DMA 中断配置 */
DMA_TransCompleteIntCmd(LCD_DMA_UNIT, DMA_INT_BTC_CH0, DISABLE);
stcIrqSignConfig.enIntSrc = LCD_DMA_TX_INT_SRC;
@@ -146,19 +146,19 @@ static void hdl_lcd_write_byte(uint8_t dat)
void hdl_lcd_send(uint8_t *data, uint16_t len)
{
LCD_DC_SET();//写数据
LCD_DC_SET();//写数据
enTxCompleteFlag = RESET;
DMA_SetSrcAddr(LCD_DMA_UNIT, LCD_DMA_TX_CH, (uint32_t)(data)); // 重新设置源地址和发送的数据
DMA_SetTransCount(LCD_DMA_UNIT, LCD_DMA_TX_CH, len); //设置传输次数,传输一次,计数器减到0停止
DMA_SetSrcAddr(LCD_DMA_UNIT, LCD_DMA_TX_CH, (uint32_t)(data)); // 重新设置源地址和发送的数据
DMA_SetTransCount(LCD_DMA_UNIT, LCD_DMA_TX_CH, len); //设置传输次数,传输一次,计数器减到0停止
DMA_ChCmd(LCD_DMA_UNIT, LCD_DMA_TX_CH, ENABLE); //使能DMA1通道
SPI_Cmd(LCD_SPI_UINT, ENABLE); //使能SPI
DMA_ChCmd(LCD_DMA_UNIT, LCD_DMA_TX_CH, ENABLE); //使能DMA1通道
SPI_Cmd(LCD_SPI_UINT, ENABLE); //使能SPI
while (RESET == enTxCompleteFlag) {
}
SPI_Cmd(LCD_SPI_UINT, DISABLE); //失能SPI
SPI_Cmd(LCD_SPI_UINT, DISABLE); //失能SPI
}
void hdl_lcd_dma_callback_register(lcd_dma_callback_t pCBS)
@@ -178,70 +178,70 @@ void hdl_lcd_timer_callback_register(lcd_timer_callback_t pCBS)
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA8(uint8_t dat)
{
LCD_DC_SET();//写数据
LCD_DC_SET();//写数据
hdl_lcd_write_byte(dat);
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(uint16_t dat)
{
LCD_DC_SET();//写数据
LCD_DC_SET();//写数据
hdl_lcd_write_byte(dat>>8);
hdl_lcd_write_byte(dat);
}
/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(uint8_t dat)
{
LCD_DC_CLR();//写命令
LCD_DC_CLR();//写命令
hdl_lcd_write_byte(dat);
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
LCD_WR_REG(0x2c);//储存器写
}
void hdl_lcd_fill(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2, uint8_t *color)
{
LCD_Address_Set(x1,y1,x2,y2);//设置显示范围
LCD_Address_Set(x1,y1,x2,y2);//设置显示范围
hdl_lcd_send(color, (x2-x1+1)*(y2-y1+1)*2);
}
void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
LCD_Address_Set(x,y,x,y);//设置光标位置
LCD_Address_Set(x,y,x,y);//设置光标位置
LCD_WR_DATA(color);
}
@@ -250,7 +250,7 @@ void hdl_lcd_init(void)
hdl_lcd_config();
hdl_lcd_timer_config();
LCD_RES_CLR();//复位
LCD_RES_CLR();//复位
hdl_delay_ms(100);
LCD_RES_SET();
hdl_delay_ms(100);
+13 -13
View File
@@ -6,7 +6,7 @@
#include "lvgl.h"
/* lcd刷屏定时器处理 */
/* lcd刷屏定时器处理 */
#define LCD_TIM_UINT CM_TMR0_1
#define LCD_TIM_CLK FCG2_PERIPH_TMR0_1
#define LCD_TIM_CH TMR0_CH_B
@@ -18,7 +18,7 @@
#define LCD_TIME_CMP_VALUE (1563)
#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#define LCD_W 240
#define LCD_H 240
@@ -57,7 +57,7 @@
#define LCD_MOSI_Clr() GPIO_ResetPins(GPIO_PORT_B,GPIO_PIN_06)//SDA=MOSI
#define LCD_MOSI_Set() GPIO_SetPins(GPIO_PORT_B,GPIO_PIN_06)
//画笔颜色
//画笔颜色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
@@ -69,16 +69,16 @@
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
typedef void (*lcd_dma_callback_t)(void);
typedef void (*lcd_timer_callback_t)(void);
+33 -33
View File
@@ -7,7 +7,7 @@ void hdl_spi1_init(void)
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 配置SPI引脚 */
/* 閰嶇疆SPI寮曡剼 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
@@ -21,20 +21,20 @@ void hdl_spi1_init(void)
GPIO_SetFunc(SPI1_MOSI_PORT, SPI1_MOSI_PIN, SPI1_MOSI_FUNC);
GPIO_SetFunc(SPI1_MISO_PORT, SPI1_MISO_PIN, SPI1_MISO_FUNC);
/* 配置SPI参数 */
/* 閰嶇疆SPI鍙傛暟 */
SPI_StructInit(&stcSpiInit);
FCG_Fcg1PeriphClockCmd(SPI1_CLOCK, ENABLE);
stcSpiInit.u32WireMode = SPI_3_WIRE; //3线SPI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //全双工
stcSpiInit.u32MasterSlave = SPI_MASTER; //主机
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 禁用模式故障检测
stcSpiInit.u32Parity = SPI_PARITY_INVD; //无奇偶校验
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI模式3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //预分频
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //数据宽度
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB高位有效
stcSpiInit.u32WireMode = SPI_3_WIRE; //3绾縎PI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //鍏ㄥ弻宸?
stcSpiInit.u32MasterSlave = SPI_MASTER; //涓绘満
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 绂佺敤妯″紡鏁呴殰妫€娴?
stcSpiInit.u32Parity = SPI_PARITY_INVD; //鏃犲鍋舵牎楠?
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI妯″紡3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //棰勫垎棰?
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //鏁版嵁瀹藉害
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB楂樹綅鏈夋晥
(void)SPI_Init(SPI1_INSTANCE, &stcSpiInit);
SPI_Cmd(SPI1_INSTANCE, ENABLE);
@@ -78,7 +78,7 @@ void hdl_spi2_init(void)
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 配置SPI引脚 */
/* 閰嶇疆SPI寮曡剼 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
@@ -92,20 +92,20 @@ void hdl_spi2_init(void)
GPIO_SetFunc(SPI2_MOSI_PORT, SPI2_MOSI_PIN, SPI2_MOSI_FUNC);
GPIO_SetFunc(SPI2_MISO_PORT, SPI2_MISO_PIN, SPI2_MISO_FUNC);
/* 配置SPI参数 */
/* 閰嶇疆SPI鍙傛暟 */
SPI_StructInit(&stcSpiInit);
FCG_Fcg1PeriphClockCmd(SPI2_CLOCK, ENABLE);
stcSpiInit.u32WireMode = SPI_3_WIRE; //3线SPI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //全双工
stcSpiInit.u32MasterSlave = SPI_MASTER; //主机
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 禁用模式故障检测
stcSpiInit.u32Parity = SPI_PARITY_INVD; //无奇偶校验
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI模式3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //预分频
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //数据宽度
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB高位有效
stcSpiInit.u32WireMode = SPI_3_WIRE; //3绾縎PI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //鍏ㄥ弻宸?
stcSpiInit.u32MasterSlave = SPI_MASTER; //涓绘満
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 绂佺敤妯″紡鏁呴殰妫€娴?
stcSpiInit.u32Parity = SPI_PARITY_INVD; //鏃犲鍋舵牎楠?
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI妯″紡3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //棰勫垎棰?
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //鏁版嵁瀹藉害
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB楂樹綅鏈夋晥
(void)SPI_Init(SPI2_INSTANCE, &stcSpiInit);
SPI_Cmd(SPI2_INSTANCE, ENABLE);
@@ -150,7 +150,7 @@ void hdl_spi3_init(void)
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 配置SPI引脚 */
/* 閰嶇疆SPI寮曡剼 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
@@ -164,20 +164,20 @@ void hdl_spi3_init(void)
GPIO_SetFunc(SPI3_MOSI_PORT, SPI3_MOSI_PIN, SPI3_MOSI_FUNC);
GPIO_SetFunc(SPI3_MISO_PORT, SPI3_MISO_PIN, SPI3_MISO_FUNC);
/* 配置SPI参数 */
/* 閰嶇疆SPI鍙傛暟 */
SPI_StructInit(&stcSpiInit);
FCG_Fcg1PeriphClockCmd(SPI3_CLOCK, ENABLE);
stcSpiInit.u32WireMode = SPI_3_WIRE; //3线SPI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //全双工
stcSpiInit.u32MasterSlave = SPI_MASTER; //主机
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 禁用模式故障检测
stcSpiInit.u32Parity = SPI_PARITY_INVD; //无奇偶校验
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI模式3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //预分频
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //数据宽度
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB高位有效
stcSpiInit.u32WireMode = SPI_3_WIRE; //3绾縎PI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //鍏ㄥ弻宸?
stcSpiInit.u32MasterSlave = SPI_MASTER; //涓绘満
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 绂佺敤妯″紡鏁呴殰妫€娴?
stcSpiInit.u32Parity = SPI_PARITY_INVD; //鏃犲鍋舵牎楠?
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI妯″紡3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //棰勫垎棰?
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //鏁版嵁瀹藉害
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB楂樹綅鏈夋晥
(void)SPI_Init(SPI3_INSTANCE, &stcSpiInit);
SPI_Cmd(SPI3_INSTANCE, ENABLE);
+11 -11
View File
@@ -7,7 +7,7 @@ void hdl_spi4_init(void)
LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 配置SPI引脚 */
/* 閰嶇疆SPI寮曡剼 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
@@ -21,20 +21,20 @@ void hdl_spi4_init(void)
GPIO_SetFunc(SPI4_MOSI_PORT, SPI4_MOSI_PIN, SPI4_MOSI_FUNC);
GPIO_SetFunc(SPI4_MISO_PORT, SPI4_MISO_PIN, SPI4_MISO_FUNC);
/* 配置SPI参数 */
/* 閰嶇疆SPI鍙傛暟 */
SPI_StructInit(&stcSpiInit);
FCG_Fcg1PeriphClockCmd(SPI4_CLOCK, ENABLE);
stcSpiInit.u32WireMode = SPI_3_WIRE; //3线SPI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //全双工
stcSpiInit.u32MasterSlave = SPI_MASTER; //主机
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 禁用模式故障检测
stcSpiInit.u32Parity = SPI_PARITY_INVD; //无奇偶校验
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI模式3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //预分频
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //数据宽度
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB高位有效
stcSpiInit.u32WireMode = SPI_3_WIRE; //3绾縎PI
stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; //鍏ㄥ弻宸?
stcSpiInit.u32MasterSlave = SPI_MASTER; //涓绘満
stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; // 绂佺敤妯″紡鏁呴殰妫€娴?
stcSpiInit.u32Parity = SPI_PARITY_INVD; //鏃犲鍋舵牎楠?
stcSpiInit.u32SpiMode = SPI_MD_3; //SPI妯″紡3
stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; //棰勫垎棰?
stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; //鏁版嵁瀹藉害
stcSpiInit.u32FirstBit = SPI_FIRST_MSB; //MSB楂樹綅鏈夋晥
(void)SPI_Init(SPI4_INSTANCE, &stcSpiInit);
SPI_Cmd(SPI4_INSTANCE, ENABLE);
+9 -9
View File
@@ -6,11 +6,11 @@
#include "hdl_usart.h"
//定义数据获取回调函数
//瀹氫箟鏁版嵁鑾峰彇鍥炶皟鍑芥暟
static hdl_debug_uart_rx_cb_t debug_rx_callback_cbs;
static com_rx_callback com_rx_callback_cbs;
//接收中断
//鎺ユ敹涓柇
static void COM_Rx_IrqCallback(void);
static void COM_RxErr_IrqCallback(void);
@@ -25,7 +25,7 @@ static void INTC_IrqInstalHandler(const stc_irq_signin_config_t* pstcConfig, uin
}
}
//调试串口
//璋冭瘯涓插彛
static void DEBUG_RxErr_IrqCallback(void)
{
(void)USART_ReadData(DEBUG_UART);
@@ -80,7 +80,7 @@ void hdl_debug_uart_init(void)
stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
USART_UART_Init(DEBUG_UART, &stcUartInit, NULL);
//接收中断配置
//鎺ユ敹涓柇閰嶇疆
stc_irq_signin_config_t stcIrqSigninConfig;
stcIrqSigninConfig.enIRQn = DEBUG_UART_INT_EI_IRQ;
stcIrqSigninConfig.enIntSrc = DEBUG_UART_INT_EI;
@@ -127,7 +127,7 @@ int hdl_debug_uart_getc(int *ch)
}
//通信模块串口初始化
//閫氫俊妯″潡涓插彛鍒濆鍖?
void hdl_com_uart_init(void)
{
stc_usart_uart_init_t stcUartInit={0};
@@ -149,7 +149,7 @@ void hdl_com_uart_init(void)
stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
USART_UART_Init(COM_UART, &stcUartInit, NULL);
//接收中断配置
//鎺ユ敹涓柇閰嶇疆
stcIrqSigninConfig.enIRQn = COM_INT_EI_IRQ;
stcIrqSigninConfig.enIntSrc = COM_INT_EI;
stcIrqSigninConfig.pfnCallback = &COM_RxErr_IrqCallback;
@@ -167,7 +167,7 @@ void hdl_com_uart_init(void)
}
//通信发送数据
//閫氫俊鍙戦€佹暟鎹?
void hdl_com_uart_send(uint8_t* w_buf, uint16_t len)
{
uint8_t i;
@@ -180,7 +180,7 @@ void hdl_com_uart_send(uint8_t* w_buf, uint16_t len)
}
}
//通信回调函数注册
//閫氫俊鍥炶皟鍑芥暟娉ㄥ唽
void hdl_com_uart_rx_register(com_rx_callback pCBS)
{
if (com_rx_callback_cbs == 0)
@@ -189,7 +189,7 @@ void hdl_com_uart_rx_register(com_rx_callback pCBS)
}
}
//通信接收中断
//閫氫俊鎺ユ敹涓柇
static void COM_Rx_IrqCallback(void)
{
uint8_t r_data = 0;
+4 -4
View File
@@ -15,7 +15,7 @@ void hdl_usb_init(void)
LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
/* 时钟配置 */
/* 鏃堕挓閰嶇疆 */
(void)CLK_PLLxStructInit(&stcUpllInit);
stcUpllInit.u8PLLState = CLK_PLLX_ON;
stcUpllInit.PLLCFGR = 0UL;
@@ -27,7 +27,7 @@ void hdl_usb_init(void)
(void)CLK_PLLxInit(&stcUpllInit);
CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP);
/* 引脚配置 */
/* 寮曡剼閰嶇疆 */
(void)GPIO_StructInit(&stcGpioCfg);
stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG;
@@ -38,10 +38,10 @@ void hdl_usb_init(void)
// GPIO_SetFunc(USB_VBUS_PORT, USB_VBUS_PIN, GPIO_FUNC_10); /* VBUS */
FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE);
/* 中断配置 */
/* 涓柇閰嶇疆 */
stcIrqRegiConf.enIRQn = INT030_IRQn;
stcIrqRegiConf.enIntSrc = INT_SRC_USBFS_GLB;
stcIrqRegiConf.pfnCallback = &USB_IRQ_Handler; // 添加中断函数
stcIrqRegiConf.pfnCallback = &USB_IRQ_Handler; // 娣诲姞涓柇鍑芥暟
(void)INTC_IrqSignIn(&stcIrqRegiConf);
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIO_15);
+15 -15
View File
@@ -5,15 +5,15 @@
#include "stdio.h"
// 系统空闲条件
// 绯荤粺绌洪棽鏉′欢
#define SYSTEM_IS_IDLE() (ALL_TASKS_IDLE())
#define DEEP_SLEEP_THRESHOLD 5 // 进入深度休眠的空闲计数阈值
#define DEEP_SLEEP_THRESHOLD 5 // 杩涘叆娣卞害浼戠湢鐨勭┖闂茶鏁伴槇鍊?
static struct {
pm_adapter_t default_adapter;
pt_t pt;
pm_mode_t current_mode; // 当前功耗模式
uint32_t ref_count[PM_SLEEP_MODE_MAX]; // 引用计数数组
pm_mode_t current_mode; // 褰撳墠鍔熻€楁ā寮?
uint32_t ref_count[PM_SLEEP_MODE_MAX]; // 寮曠敤璁℃暟鏁扮粍
} pm;
static bool system_is_idle(void)
@@ -22,13 +22,13 @@ static bool system_is_idle(void)
}
/*
功耗管理:遍历所有任务状态,然后根据用于请求的功耗模式,调用适配器接口,调整MCU的运行模式
鍔熻€楃鐞嗭細閬嶅巻鎵€鏈変换鍔$姸鎬侊紝鐒跺悗鏍规嵁鐢ㄤ簬璇锋眰鐨勫姛鑰楁ā寮忥紝璋冪敤閫傞厤鍣ㄦ帴鍙o紝璋冩暣MCU鐨勮繍琛屾ā寮?
*/
static void pt_pm_handler(void) {
if (system_is_idle()) {
// 切换到下一个可用的功耗模式
// 鍒囨崲鍒颁笅涓€涓彲鐢ㄧ殑鍔熻€楁ā寮?
pm_mode_t next_mode = PM_SLEEP_MODE_NONE;
for (pm_mode_t m = PM_SLEEP_MODE_NONE; m < PM_SLEEP_MODE_MAX; m++) {
if (pm.ref_count[m] > 0 ) {
@@ -43,7 +43,7 @@ static void pt_pm_handler(void) {
} else {
pt_pm_release(PM_SLEEP_MODE_NONE); // 唤醒系统
pt_pm_release(PM_SLEEP_MODE_NONE); // 鍞ら啋绯荤粺
if (pm.default_adapter.wakeup) {
pm.default_adapter.wakeup();
@@ -55,7 +55,7 @@ static void pt_pm_handler(void) {
void pt_pm_adapter_init(pm_adapter_t *adapter) {
if (adapter) {
pm.default_adapter = *adapter; // 复制整个结构体
pm.default_adapter = *adapter; // 澶嶅埗鏁翠釜缁撴瀯浣?
} else {
pm.default_adapter.sleep = 0;
pm.default_adapter.wakeup = 0;
@@ -74,7 +74,7 @@ int pt_task_pm(void) {
while (1) {
pt_pm_handler(); // 处理功耗状态
pt_pm_handler(); // 澶勭悊鍔熻€楃姸鎬?
PT_DELAY_MS(&pm.pt, system_is_idle() ? 1000 : 100);
}
@@ -83,23 +83,23 @@ int pt_task_pm(void) {
}
/*
请求功耗模式:引用计数自增,如果为1,则调用适配器接口,调整MCU的运行模式
璇锋眰鍔熻€楁ā寮忥細寮曠敤璁℃暟鑷锛屽鏋滀负1锛屽垯璋冪敤閫傞厤鍣ㄦ帴鍙o紝璋冩暣MCU鐨勮繍琛屾ā寮?
*/
void pt_pm_request(pm_mode_t mode) {
if (mode >= PM_SLEEP_MODE_MAX) {
return; // 无效模式
return; // 鏃犳晥妯″紡
}
pm.ref_count[mode]++; // 仅操作引用计数
pm.ref_count[mode]++; // 浠呮搷浣滃紩鐢ㄨ鏁?
}
/*
释放功耗模式:引用计数自减,如果为0,则调用适配器接口,调整MCU的运行模式
閲婃斁鍔熻€楁ā寮忥細寮曠敤璁℃暟鑷噺锛屽鏋滀负0锛屽垯璋冪敤閫傞厤鍣ㄦ帴鍙o紝璋冩暣MCU鐨勮繍琛屾ā寮?
*/
void pt_pm_release(pm_mode_t mode) {
if (mode >= PM_SLEEP_MODE_MAX) {
return; // 无效模式
return; // 鏃犳晥妯″紡
}
if (pm.ref_count[mode] > 0) {
pm.ref_count[mode]--; // 仅操作引用计数
pm.ref_count[mode]--; // 浠呮搷浣滃紩鐢ㄨ鏁?
}
}