Files
BLV_C1F_Module/BasicCode/Drive/BLE/HAL/MCU.c
caocong 95916b9995 fix:修改UDP通讯中,取电变化上报机制
1、问题点:当RCU网络状态异常的情况下,网络还处于协商状态下,还未进入正常通讯环节时,取电变化不会进行判断。这会导致取电变化上报与实际产生取电状态时间点对不上。
2、将BLV_C1F_Module代码上传至Gitea,之前代码修改记录请查看 .\BasicCode\Readme.txt
2026-01-23 09:23:12 +08:00

274 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/********************************** (C) COPYRIGHT *******************************
* File Name : MCU.c
* Author : WCH
* Version : V1.1
* Date : 2019/11/05
* Description : 硬件任务处理函数及BLE和硬件初始化
*******************************************************************************/
/******************************************************************************/
/* 头文件包含 */
#include "CH57x_common.h"
#include "HAL.h"
tmosTaskID halTaskID;
#if BLE_CODE_EN
__align(4) u32 MEM_BUF[BLE_MEMHEAP_SIZE/4]; //蓝牙协议栈需要的内存
#endif
/*******************************************************************************
* @fn Lib_Calibration_LSI
*
* @brief 内部32k校准
*
* input parameters
*
* @param None.
*
* output parameters
*
* @param None.
*
* @return None.
*/
void Lib_Calibration_LSI( void )
{
if( Calibration_LSI() > 2 )
{
Calibration_LSI();
}
}
/*******************************************************************************
* @fn CH57X_BLEInit
*
* @brief BLE 库初始化
*
* input parameters
*
* @param None.
*
* output parameters
*
* @param None.
*
* @return None.
*/
#if BLE_CODE_EN
void CH57X_BLEInit( void )
{
uint8 i;
bleConfig_t cfg;
if( tmos_memcmp( VER_LIB,VER_FILE,strlen(VER_FILE)) == FALSE ){
PRINT("head file error...\n");
while(1);
}
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1; //写入0x57
R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2; //再写入0xA8接下来约16个周期将打开安全锁进入安全访问模式
R16_CLK_SYS_CFG = RB_CLK_OSC32M_XT|(2<<6)|0x08; // 32M -> Fsys 配置系统时钟采用外部晶振32M作为系统主频
R8_SAFE_ACCESS_SIG = 0; //退出安全模式
// SysTick_Config( SysTick_LOAD_RELOAD_Msk ); //配置滴答定时器
// SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk ; /* disable SysTick IRQ */
tmos_memset(&cfg,0,sizeof(bleConfig_t));
cfg.MEMAddr = (u32)MEM_BUF;
cfg.MEMLen = (u32)BLE_MEMHEAP_SIZE; //蓝牙协议栈使用的RAM大小不小于6K
cfg.BufMaxLen = (u32)BLE_BUFF_MAX_LEN; //单个连接最大包长度
cfg.BufNumber = (u32)BLE_BUFF_NUM; //控制器缓存的包数量
cfg.TxNumEvent = (u32)BLE_TX_NUM_EVENT; //单个连接事件最多可以发多少个数据包
cfg.TxPower = (u32)BLE_TX_POWER; //蓝牙发射功率
#if (defined (BLE_SNV)) && (BLE_SNV == TRUE)
cfg.SNVAddr = (u32)BLE_SNV_ADDR;
#endif
#if( CLK_OSC32K )
cfg.SelRTCClock = (u32)CLK_OSC32K;
#endif
cfg.ConnectNumber = (PERIPHERAL_MAX_CONNECTION&3)|(CENTRAL_MAX_CONNECTION<<2); //
cfg.srandCB = SYS_GetSysTickCnt; //注册生成随机种子的程序
#if (defined TEM_SAMPLE) && (TEM_SAMPLE == TRUE)
cfg.tsCB = HAL_GetInterTempValue; // 根据温度变化校准RF和内部RC( 大于7摄氏度 )
#if( CLK_OSC32K )
cfg.rcCB = Lib_Calibration_LSI; // 内部32K时钟校准
#endif
#endif
#if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE)
cfg.WakeUpTime = WAKE_UP_RTC_MAX_TIME;
cfg.sleepCB = CH57X_LowPower; // 启用睡眠
#endif
#if (defined (BLE_MAC)) && (BLE_MAC == TRUE)
for(i=0;i<6;i++) cfg.MacAddr[i] = MACAddr[5-i]; //MAC地址
#endif
if( !cfg.MEMAddr || cfg.MEMLen < 4*1024 )while(1);
#if (defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
if( (u32)MEM_BUF < (u32)0x20003800 ){
PRINT("RAM config error...\n");
PRINT("MEM_BUF%p\n", MEM_BUF);
PRINT("BLE_MEMHEAP_SIZE%d\n", BLE_MEMHEAP_SIZE);
while(1);
}
#endif
i = BLE_LibInit( &cfg );
if(i){
PRINT("LIB init error code: %x ...\n",i);
while(1);
}
}
#endif
/*******************************************************************************
* @fn HAL_ProcessEvent
*
* @brief 硬件层事务处理
*
* input parameters
*
* @param task_id.
* @param events.
*
* output parameters
*
* @param events.
*
* @return None.
*/
tmosEvents HAL_ProcessEvent( tmosTaskID task_id, tmosEvents events )
{
uint8 * msgPtr;
if( events & SYS_EVENT_MSG ){ // 处理HAL层消息调用tmos_msg_receive读取消息处理完成后删除消息。
msgPtr = tmos_msg_receive(task_id); //receive a msg
if( msgPtr ){
/* De-allocate */
tmos_msg_deallocate( msgPtr ); //delete a msg
}
return events ^ SYS_EVENT_MSG;
}
if ( events & LED_BLINK_EVENT ){
#if (defined HAL_LED) && (HAL_LED == TRUE)
HalLedUpdate( );
#endif // HAL_LED
return events ^ LED_BLINK_EVENT;
}
if( events & HAL_KEY_EVENT ){
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
HAL_KeyPoll(); /* Check for keys */
if (!Hal_KeyIntEnable){
tmos_start_task( halTaskID, HAL_KEY_EVENT, MS1_TO_SYSTEM_TIME(100) );
}
return events ^ HAL_KEY_EVENT;
#endif
}
if( events & HAL_REG_INIT_EVENT ){
#if (defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // 校准任务单次校准耗时小于10ms
BLE_RegInit(); // 校准RF
#if( CLK_OSC32K )
Lib_Calibration_LSI(); // 校准内部RC
#endif
tmos_start_task( halTaskID , HAL_REG_INIT_EVENT ,MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD) );
return events ^ HAL_REG_INIT_EVENT;
#endif
}
if( events & HAL_TEST_EVENT ){
PRINT("* ");
tmos_start_task( halTaskID , HAL_TEST_EVENT ,MS1_TO_SYSTEM_TIME(10000) );
return events ^ HAL_TEST_EVENT;
}
return 0;
}
/*******************************************************************************
* @fn HAL_Init
*
* @brief 硬件初始化
*
* input parameters
*
* @param None.
*
* output parameters
*
* @param None.
*
* @return None.
*/
void HAL_Init( )
{
halTaskID = TMOS_ProcessEventRegister( HAL_ProcessEvent ); //注册一个 TMOS 回调函数,并分配 ID
HAL_TimeInit( );
#if (defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
HAL_SleepInit( );
#endif
#if (defined HAL_LED) && (HAL_LED == TRUE)
HAL_LedInit( );
#endif
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
HAL_KeyInit( );
#endif
__enable_irq();
#if (defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE)
tmos_start_task( halTaskID , HAL_REG_INIT_EVENT ,MS1_TO_SYSTEM_TIME(BLE_CALIBRATION_PERIOD) ); // 添加校准任务单次校准耗时小于10ms
#endif
// tmos_start_task( halTaskID , HAL_TEST_EVENT ,1000 ); // 添加一个测试任务
}
/*******************************************************************************
* @fn LLE_IRQHandler
*
* @brief LLE interrupt function
*
* input parameters
*
* @param None.
*
* output parameters
*
* @param None.
*
* @return None.
*/
void LLE_IRQHandler(void)
{
BLE_IRQHandler();
}
/*******************************************************************************
* @fn HAL_GetInterTempValue
*
* @brief None.
*
* input parameters
*
* @param None.
*
* output parameters
*
* @param None.
*
* @return None.
*/
uint16 HAL_GetInterTempValue( void )
{
uint8 sensor,channel,config;
uint16 adc_data;
sensor = R8_TEM_SENSOR;
channel = R8_ADC_CHANNEL;
config = R8_ADC_CFG;
R8_TEM_SENSOR |= RB_TEM_SEN_PWR_ON;
R8_ADC_CHANNEL = CH_INTE_VTEMP;
R8_ADC_CFG = RB_ADC_POWER_ON|( 2<<4 ) ;
R8_ADC_CONVERT |= RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
adc_data = R16_ADC_DATA;
R8_TEM_SENSOR = sensor;
R8_ADC_CHANNEL = channel;
R8_ADC_CFG = config;
return( adc_data );
}
/******************************** endfile @ mcu ******************************/