2024-12-02 16:26:55 +08:00
|
|
|
|
/********************************** (C) COPYRIGHT *******************************
|
|
|
|
|
* File Name : MCU.c
|
|
|
|
|
* Author : WCH
|
|
|
|
|
* Version : V1.2
|
|
|
|
|
* Date : 2022/01/18
|
|
|
|
|
* Description : Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BLE<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************
|
|
|
|
|
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
|
2024-12-08 11:29:48 +08:00
|
|
|
|
* Attention: This software (modified or not) and binary are used for
|
2024-12-02 16:26:55 +08:00
|
|
|
|
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
/* ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
#include "HAL.h"
|
|
|
|
|
|
|
|
|
|
tmosTaskID halTaskID;
|
|
|
|
|
uint32_t g_LLE_IRQLibHandlerLocation;
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn Lib_Calibration_LSI
|
|
|
|
|
*
|
|
|
|
|
* @brief <EFBFBD>ڲ<EFBFBD>32kУ
|
|
|
|
|
*
|
|
|
|
|
* @param None.
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
void Lib_Calibration_LSI(void)
|
|
|
|
|
{
|
|
|
|
|
Calibration_LSI(Level_64);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if(defined(BLE_SNV)) && (BLE_SNV == TRUE)
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn Lib_Read_Flash
|
|
|
|
|
*
|
|
|
|
|
* @brief Callback function used for BLE lib.
|
|
|
|
|
*
|
|
|
|
|
* @param addr - Read start address
|
|
|
|
|
* @param num - Number of units to read (unit: 4 bytes)
|
|
|
|
|
* @param pBuf - Buffer to store read data
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
uint32_t Lib_Read_Flash(uint32_t addr, uint32_t num, uint32_t *pBuf)
|
|
|
|
|
{
|
|
|
|
|
EEPROM_READ(addr, pBuf, num * 4);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn Lib_Write_Flash_592A
|
|
|
|
|
*
|
|
|
|
|
* @brief Callback function used for BLE lib.
|
|
|
|
|
*
|
|
|
|
|
* @param addr - Write start address
|
|
|
|
|
* @param num - Number of units to write (unit: 4 bytes)
|
|
|
|
|
* @param pBuf - Buffer with data to be written
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
void Lib_Write_Flash_592A(uint32_t addr, uint32_t num, uint32_t *pBuf)
|
|
|
|
|
{
|
|
|
|
|
__attribute__((aligned(4))) uint32_t FLASH_BUF[(BLE_SNV_BLOCK*BLE_SNV_NUM) / 4];
|
|
|
|
|
EEPROM_READ(addr&0xFFFFF000, FLASH_BUF, BLE_SNV_BLOCK*BLE_SNV_NUM);
|
|
|
|
|
tmos_memcpy(&FLASH_BUF[addr&0xFFF], pBuf, num * 4);
|
|
|
|
|
EEPROM_ERASE(addr&0xFFFFF000, ((BLE_SNV_BLOCK*BLE_SNV_NUM+EEPROM_BLOCK_SIZE-1)/EEPROM_BLOCK_SIZE)*EEPROM_BLOCK_SIZE);
|
|
|
|
|
EEPROM_WRITE(addr&0xFFFFF000, FLASH_BUF, BLE_SNV_BLOCK*BLE_SNV_NUM);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn Lib_Write_Flash
|
|
|
|
|
*
|
|
|
|
|
* @brief Callback function used for BLE lib.
|
|
|
|
|
*
|
|
|
|
|
* @param addr - Write start address
|
|
|
|
|
* @param num - Number of units to write (unit: 4 bytes)
|
|
|
|
|
* @param pBuf - Buffer with data to be written
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
uint32_t Lib_Write_Flash(uint32_t addr, uint32_t num, uint32_t *pBuf)
|
|
|
|
|
{
|
|
|
|
|
if(((*(uint32_t*)ROM_CFG_VERISON)&0xFF) == DEF_CHIP_ID_CH592A)
|
|
|
|
|
{
|
|
|
|
|
Lib_Write_Flash_592A(addr, num, pBuf);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
EEPROM_ERASE(addr, num * 4);
|
|
|
|
|
EEPROM_WRITE(addr, pBuf, num * 4);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn CH59x_BLEInit
|
|
|
|
|
*
|
|
|
|
|
* @brief BLE <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* @param None.
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
void CH59x_BLEInit(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t i;
|
|
|
|
|
bleConfig_t cfg;
|
|
|
|
|
if(tmos_memcmp(VER_LIB, VER_FILE, strlen(VER_FILE)) == FALSE)
|
|
|
|
|
{
|
|
|
|
|
PRINT("head file error...\n");
|
|
|
|
|
while(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SysTick_Config(SysTick_LOAD_RELOAD_Msk);// <20><><EFBFBD><EFBFBD>SysTick<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|
|
|
|
PFIC_DisableIRQ(SysTick_IRQn);
|
|
|
|
|
|
|
|
|
|
g_LLE_IRQLibHandlerLocation = (uint32_t)LLE_IRQLibHandler;
|
|
|
|
|
PFIC_SetPriority(BLEL_IRQn, 0xF0);
|
|
|
|
|
tmos_memset(&cfg, 0, sizeof(bleConfig_t));
|
|
|
|
|
cfg.MEMAddr = (uint32_t)MEM_BUF;
|
|
|
|
|
cfg.MEMLen = (uint32_t)BLE_MEMHEAP_SIZE;
|
|
|
|
|
cfg.BufMaxLen = (uint32_t)BLE_BUFF_MAX_LEN;
|
|
|
|
|
cfg.BufNumber = (uint32_t)BLE_BUFF_NUM;
|
|
|
|
|
cfg.TxNumEvent = (uint32_t)BLE_TX_NUM_EVENT;
|
|
|
|
|
cfg.TxPower = (uint32_t)BLE_TX_POWER;
|
|
|
|
|
#if(defined(BLE_SNV)) && (BLE_SNV == TRUE)
|
|
|
|
|
if((BLE_SNV_ADDR + BLE_SNV_BLOCK * BLE_SNV_NUM) > (0x78000 - FLASH_ROM_MAX_SIZE))
|
|
|
|
|
{
|
|
|
|
|
PRINT("SNV config error...\n");
|
|
|
|
|
while(1);
|
|
|
|
|
}
|
|
|
|
|
cfg.SNVAddr = (uint32_t)BLE_SNV_ADDR;
|
|
|
|
|
cfg.SNVBlock = (uint32_t)BLE_SNV_BLOCK;
|
|
|
|
|
cfg.SNVNum = (uint32_t)BLE_SNV_NUM;
|
|
|
|
|
cfg.readFlashCB = Lib_Read_Flash;
|
|
|
|
|
cfg.writeFlashCB = Lib_Write_Flash;
|
|
|
|
|
#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; // <20><><EFBFBD><EFBFBD><EFBFBD>¶ȱ仯УRF<52><46><EFBFBD>ڲ<EFBFBD>RC( <20><><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD>϶<EFBFBD> )
|
|
|
|
|
#if(CLK_OSC32K)
|
|
|
|
|
cfg.rcCB = Lib_Calibration_LSI; // <20>ڲ<EFBFBD>32Kʱ<4B><CAB1>У
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
|
|
|
|
|
cfg.idleCB = CH59x_LowPower; // <20><><EFBFBD><EFBFBD>˯<EFBFBD><CBAF>
|
|
|
|
|
#endif
|
|
|
|
|
#if(defined(BLE_MAC)) && (BLE_MAC == TRUE)
|
|
|
|
|
for(i = 0; i < 6; i++)
|
|
|
|
|
{
|
|
|
|
|
cfg.MacAddr[i] = MacAddr[5 - i];
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
{
|
|
|
|
|
uint8_t MacAddr[6];
|
|
|
|
|
GetMACAddress(MacAddr);
|
2024-12-15 19:04:05 +08:00
|
|
|
|
for(i = 0; i < 6; i++)
|
|
|
|
|
{
|
|
|
|
|
cfg.MacAddr[i] = MacAddr[i]; // ʹ<><CAB9>оƬmac<61><63>ַ
|
|
|
|
|
// PRINT("MacAddr[%d]: %x\n", i, MacAddr[i]);
|
|
|
|
|
}
|
2024-12-02 16:26:55 +08:00
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
if(!cfg.MEMAddr || cfg.MEMLen < 4 * 1024)
|
|
|
|
|
{
|
|
|
|
|
while(1);
|
|
|
|
|
}
|
|
|
|
|
i = BLE_LibInit(&cfg);
|
|
|
|
|
if(i)
|
|
|
|
|
{
|
|
|
|
|
PRINT("LIB init error code: %x ...\n", i);
|
|
|
|
|
while(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn HAL_ProcessEvent
|
|
|
|
|
*
|
|
|
|
|
* @brief Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* @param task_id - The TMOS assigned task ID.
|
|
|
|
|
* @param events - events to process. This is a bit map and can
|
|
|
|
|
* contain more than one event.
|
|
|
|
|
*
|
|
|
|
|
* @return events.
|
|
|
|
|
*/
|
|
|
|
|
tmosEvents HAL_ProcessEvent(tmosTaskID task_id, tmosEvents events)
|
|
|
|
|
{
|
|
|
|
|
uint8_t *msgPtr;
|
|
|
|
|
|
|
|
|
|
if(events & SYS_EVENT_MSG)
|
|
|
|
|
{ // <20><><EFBFBD><EFBFBD>HAL<41><4C><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tmos_msg_receive<76><65>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
|
|
|
|
msgPtr = tmos_msg_receive(task_id);
|
|
|
|
|
if(msgPtr)
|
|
|
|
|
{
|
|
|
|
|
/* De-allocate */
|
|
|
|
|
tmos_msg_deallocate(msgPtr);
|
|
|
|
|
}
|
|
|
|
|
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 */
|
|
|
|
|
tmos_start_task(halTaskID, HAL_KEY_EVENT, MS1_TO_SYSTEM_TIME(100));
|
|
|
|
|
return events ^ HAL_KEY_EVENT;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
if(events & HAL_REG_INIT_EVENT)
|
|
|
|
|
{
|
|
|
|
|
uint8_t x32Kpw;
|
|
|
|
|
#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE) // У<D0A3><D7BC><EFBFBD><EFBFBD><F1A3ACB5><EFBFBD>У<D0A3><D7BC>ʱС<CAB1><D0A1>10ms
|
|
|
|
|
BLE_RegInit(); // УRF
|
|
|
|
|
#if(CLK_OSC32K)
|
|
|
|
|
Lib_Calibration_LSI(); // У<D0A3>ڲ<EFBFBD>RC
|
|
|
|
|
#else
|
|
|
|
|
x32Kpw = (R8_XT32K_TUNE & 0xfc) | 0x01;
|
|
|
|
|
sys_safe_access_enable();
|
|
|
|
|
R8_XT32K_TUNE = x32Kpw; // LSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
|
|
|
|
|
sys_safe_access_disable();
|
|
|
|
|
#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("* \n");
|
|
|
|
|
tmos_start_task(halTaskID, HAL_TEST_EVENT, MS1_TO_SYSTEM_TIME(1000));
|
|
|
|
|
return events ^ HAL_TEST_EVENT;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn HAL_Init
|
|
|
|
|
*
|
|
|
|
|
* @brief Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* @param None.
|
|
|
|
|
*
|
|
|
|
|
* @return None.
|
|
|
|
|
*/
|
|
|
|
|
void HAL_Init()
|
|
|
|
|
{
|
|
|
|
|
halTaskID = TMOS_ProcessEventRegister(HAL_ProcessEvent);
|
|
|
|
|
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
|
|
|
|
|
#if(defined BLE_CALIBRATION_ENABLE) && (BLE_CALIBRATION_ENABLE == TRUE)
|
|
|
|
|
tmos_start_task(halTaskID, HAL_REG_INIT_EVENT, 800); // <20><><EFBFBD><EFBFBD>У<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3><D7BC>ʱС<CAB1><D0A1>10ms
|
|
|
|
|
#endif
|
|
|
|
|
// tmos_start_task( halTaskID, HAL_TEST_EVENT, 1600 ); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @fn HAL_GetInterTempValue
|
|
|
|
|
*
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD>ڲ<EFBFBD><EFBFBD>¸в<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD>жϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* @return <EFBFBD>ڲ<EFBFBD><EFBFBD>¸в<EFBFBD><EFBFBD><EFBFBD>ֵ.
|
|
|
|
|
*/
|
|
|
|
|
uint16_t HAL_GetInterTempValue(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t sensor, channel, config, tkey_cfg;
|
|
|
|
|
uint16_t adc_data;
|
|
|
|
|
|
|
|
|
|
tkey_cfg = R8_TKEY_CFG;
|
|
|
|
|
sensor = R8_TEM_SENSOR;
|
|
|
|
|
channel = R8_ADC_CHANNEL;
|
|
|
|
|
config = R8_ADC_CFG;
|
|
|
|
|
ADC_InterTSSampInit();
|
|
|
|
|
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;
|
|
|
|
|
R8_TKEY_CFG = tkey_cfg;
|
|
|
|
|
return (adc_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************** endfile @ mcu ******************************/
|