完成串口接收程序
参考前面的
uint8_t aRxBuffer;
HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
uint8_t UART1RxBuff[100];
uint8_t UART1RxBuffCount;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
UART1RxBuff[UART1RxBuffCount++] = aRxBuffer; //类似标准外设库函数
}
HAL_UART_Receive_IT(huart, (uint8_t *)&aRxBuffer, 1) ;
---------------------
作者:GKoSon
来源:CSDN
原文:https://blog.csdn.net/weixin_42381351/article/details/87176531
版权声明:本文为博主原创文章,转载请附上博文链接!
只需要:
uint8_t UART1RxBuff[20*1024] __attribute__ ((at(0X20001000)));
即可
考虑接收完成的事情
http://www.stmcu.org.cn/module/forum/thread-606717-1-1.html
跳转函数!!
while (1)
{
HAL_Delay(100);
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
/* USER CODE END WHILE */
if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==0)//一旦按下就是接地了
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==0)
{
printf("按键按下\r\n");
if(((*(uint32_t*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX. WHY?
{
printf("代码合法 准备跳转\r\n");
iap_load_app(0X20001000);//SRAM地址
}
}
}
前面USART已经放置好了代码 自动放好的!! 我们现在要跳转
#if defined ( __CC_ARM ) // 使用Keil编译环境
__asm void MSR_MSP ( uint32_t ulAddr )
{
MSR MSP, r0 //set Main Stack value
BX r14
}
#elif defined ( __ICCARM__ ) // 使用IAR编译环境
void MSR_MSP ( uint32_t ulAddr )
{
asm("MSR MSP, r0"); //set Main Stack value
asm("BX r14");
}
#endif
typedef void (*iapfun)(void); //定义一个函数类型的参数.
iapfun jump2app;
void iap_load_app(uint32_t appxaddr)
{
if(((*(uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(uint32_t*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(uint32_t*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
好了 代码写完准备测试