245 lines
6.0 KiB
C
245 lines
6.0 KiB
C
|
|
#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<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD>棬<EFBFBD><EFBFBD>0x20000800<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><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 Get_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;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
|
__HAL_RCC_CLEAR_RESET_FLAGS();
|
|||
|
|
}
|