MS-DTU/Anjiehui7_TTS_ST_V2.4_LOCAL/User/hal_interface.c

248 lines
6.0 KiB
C
Raw Normal View History

2025-04-03 14:18:58 +08:00
#include "includes.h"
#define DEBUG_PORT USART2
// ϵͳTickCount
volatile u32 Systick_TickCount = 0;
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile uint32_t SYS_RSTSTS = 0;
// ʵ<><CAB5>stdout<75><74>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int stdout_putchar(int ch)
{
while(!(DEBUG_PORT->ISR & LL_USART_ISR_TXE));
DEBUG_PORT->TDR = (uint8_t) ch;
return ch;
}
u32 GetDelayTick(u32 ms)
{
return GetTickCount() + ms;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 IsTickOut(u32 OutTick)
{
u32 tick = GetTickCount();
if(tick > OutTick)
{
if(tick - OutTick > 0x80000000UL)
return 0;
return 1;
}
if(OutTick - tick > 0x80000000UL)
return 1;
return 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3>жϿ<D0B6><CFBF><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>Ч
void delay_ms(u32 ms)
{
u32 tick = GetDelayTick(ms);
do
{
} while(!IsTickOut(tick));
}
void delay_us(uint16_t us)
{
uint32_t j;
while(us--)
{
j = SystemCoreClock / 1000000;
while(j--);
}
}
/* *************************************************************************
Bootloader<EFBFBD><EFBFBD>App<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>
1. Bootloader<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>СΪ8K<EFBFBD><EFBFBD>0x08000000~0x08001FFF)
App<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x08002000<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>СΪ0x3E000
2. Bootloader<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>СΪ2K<EFBFBD><EFBFBD>0x20000000~0x200007FF<EFBFBD><EFBFBD>
//App<70><70><EFBFBD>ڴ<EFBFBD><DAB4>ں<EFBFBD><DABA><EFBFBD><E6A3AC>0x20000800<30><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>СΪ0xF800
3. <EFBFBD><EFBFBD>Bootloader<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>App<EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>__disable_irq<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵı<EFBFBD>־λ<EFBFBD><EFBFBD><EFBFBD>
4) <EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ջ<EFBFBD><EFBFBD>MSP<EFBFBD><EFBFBD>ΪApp<EFBFBD>Ķ<EFBFBD>ջֵ
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>App<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4. <EFBFBD><EFBFBD>App<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Bootloader<EFBFBD><EFBFBD>
ֱ<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bootloader
5. Bootloader<EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Targetҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IROM1<EFBFBD><EFBFBD>IRAM1
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Linkerҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Use Memory Layout from Target Dialog<EFBFBD><EFBFBD>
6. App<EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Targetҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IROM1<EFBFBD><EFBFBD>IRAM1
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Linkerҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Use Memory Layout from Target Dialog<EFBFBD><EFBFBD>
3) <EFBFBD><EFBFBD>system_stm32l4xx.c<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD>
a. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VECT_TAB_OFFSET<EFBFBD><EFBFBD>Ϊ0x2000
b. <EFBFBD><EFBFBD>SystemInit<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>__enable_irq)
7. <EFBFBD><EFBFBD>App<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Bootloader<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪҪ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>̫<EFBFBD>û<EFBFBD><EFBFBD>һһ<EFBFBD><EFBFBD><EFBFBD>
Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFreeRTOS<EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩģʽ<EFBFBD>ӹ<EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PSP<EFBFBD><EFBFBD>MSP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ȡ<EFBFBD>
************************************************************************* */
typedef void (*pIapFun_TypeDef)(void); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD>.
// ʵ<>ִ<EFBFBD>Bootloader<65><72>ת<EFBFBD><D7AA>App
void JumpToEntry(uint32_t addr)
{
printf("\r\nJump to 0x%08X\r\n", addr);
__disable_irq();
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
__set_MSP(*(volatile uint32_t *) addr);
((pIapFun_TypeDef) (*(volatile uint32_t *) (addr + 4)))();
// <20><>Ӧ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(1)
printf(".");
}
// ʵ<>ִ<EFBFBD>App<70><70>ת<EFBFBD><D7AA>Bootloader
void JumpToLoader()
{
printf("\r\nJump to 0x%08X\r\n", (uint32_t) FLASH_BASE);
// ֱ<>Ӹ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Bootloader
HAL_NVIC_SystemReset();
// <20><>Ӧ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(1)
printf(".");
}
// ʵ<>ִ<EFBFBD><D6B4>ڷ<EFBFBD><DAB7><EFBFBD>
USART_Handle huart1 = {USART1, 0, 0, 1, NULL, NULL, NULL};
USART_Handle huart2 = {USART2, 0, 0, 1, NULL, NULL, NULL};
USART_Handle huart3 = {USART3, 0, 0, 1, NULL, NULL, NULL};
USART_Handle hlpuart1 = {LPUART1, 0, 0, 1, NULL, NULL, NULL};
// ʵ<>ִ<EFBFBD><D6B4>ڷ<EFBFBD><DAB7><EFBFBD>
void UART_Transmit(USART_Handle *huart, uint8_t *buf, uint16_t len)
{
while(len--)
{
while(!(huart->Instance->ISR & LL_USART_ISR_TXE));
huart->Instance->TDR = *buf++;
}
while(!(huart->Instance->ISR & LL_USART_ISR_TC));
}
// ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6>ʽ<EFBFBD><CABD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>
void UART_TxISR_8BIT(USART_Handle *huart)
{
/* Check that a Tx process is ongoing */
if(!huart->BusyTx)
return;
if (huart->TxXferCount == 0U)
{
/* Disable the UART Transmit Data Register Empty Interrupt */
CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
/* Enable the UART Transmit Complete Interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
}
else
{
huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
huart->pTxBuffPtr++;
huart->TxXferCount--;
}
}
uint8_t UART_Transmit_IT(USART_Handle *huart, uint8_t *pData, uint16_t Size)
{
/* Check that a Tx process is not already ongoing */
if(huart->BusyTx)
return 0;
huart->pTxBuffPtr = pData;
huart->TxXferCount = Size;
huart->TxISR = UART_TxISR_8BIT;
huart->BusyTx = 1;
/* Enable the Transmit Data Register Empty interrupt */
SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
return 1;
}
// Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
void APP_USART_IRQHandler(USART_Handle *huart)
{
uint32_t isrflags = huart->Instance->ISR;
uint32_t cr1its = huart->Instance->CR1;
uint32_t errorflags = (isrflags & ((uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_NE | USART_ISR_ORE)));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
LL_USART_ClearFlag_PE(huart->Instance);
LL_USART_ClearFlag_FE(huart->Instance);
LL_USART_ClearFlag_NE(huart->Instance);
LL_USART_ClearFlag_ORE(huart->Instance);
/* If no error occurs */
if (errorflags == 0U)
{
/* UART in mode Receiver ---------------------------------------------------*/
if (((isrflags & USART_ISR_RXNE) != 0U)
&& ((cr1its & USART_CR1_RXNEIE) != 0U))
{
if(huart->RxISR)
huart->RxISR(huart);
else
huart->Instance->RDR;
}
/* UART in mode Transmit ---------------------------------------------------*/
if (((isrflags & USART_ISR_TXE) != 0U)
&& ((cr1its & USART_CR1_TXEIE) != 0U))
{
if(huart->TxISR)
huart->TxISR(huart);
else
{
// <20><>Ӧ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
huart->BusyTx = 0;
}
}
/* UART in mode Transmitter (transmission end) -----------------------------*/
if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
{
/* Disable the UART Transmit Complete Interrupt */
CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>æ<EFBFBD><C3A6>־
huart->BusyTx = 0;
}
}
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Fetch_ResetFlags()
{
if(LL_RCC_IsActiveFlag_BORRST())
SYS_RSTSTS |= 0x01;
if(LL_RCC_IsActiveFlag_PINRST())
SYS_RSTSTS |= 0x02;
if(LL_RCC_IsActiveFlag_IWDGRST())
SYS_RSTSTS |= 0x04;
if(LL_RCC_IsActiveFlag_LPWRRST())
SYS_RSTSTS |= 0x10;
if(LL_RCC_IsActiveFlag_SFTRST())
{
SYS_RSTSTS |= 0x20;
SYS_RSTSTS &= ~0x13;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
__HAL_RCC_CLEAR_RESET_FLAGS();
}