#include "main.h" /* ********************************************************************************************************* * * 模块名称 : 主程序模块 * 文件名称 : main.c * 版 本 : V1.0 * 说 明 : 学习OS特性。 * 实验目的: * 1. 学习Cortex-M内核的OS特性。 * 注意事项: * 1. 本实验推荐使用串口软件SecureCRT或者H7-TOOL上位机软件查看打印信息, * 波特率115200,数据位8,奇偶校验位无,停止位1。 * 2. 务必将编辑器的缩进参数和TAB设置为4来阅读本文件,要不代码显示不整齐。 * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2022-01-18 Eric2013 1. CMSIS软包版本 V5.4.0 * 2. HAL库版本 V1.3.0 * * Copyright (C), 2022-2030, 安富莱电子 www.armfly.com * ********************************************************************************************************* */ //#include "bsp.h" /* 底层硬件驱动 */ /* 定义例程名和例程发布日期 */ #define EXAMPLE_NAME "Cortex-M内核的OS特性学习" #define EXAMPLE_DATE "2022-01-18" #define DEMO_VER "1.0" static void PrintfLogo(void); void __svc(0) SVCTest(uint32_t a, uint32_t b, uint32_t c); /* SVC软中断 */ uint32_t PspStack[100]; /* PspStack栈空间 */ uint32_t *p_stk; /* 栈操作变量 */ /* ********************************************************************************************************* * 函 数 名: main * 功能说明: c程序入口 * 形 参: 无 * 返 回 值: 错误代码(无需处理) ********************************************************************************************************* */ int main(void) { /* 双堆栈知识点: SP(R13寄存器)有两个栈指针,MSP主栈指针和PSP进程栈指针。 简单的说,我们在中断服务程序里面都是用的MSP,而任务里面用的PSP。 */ /*##- 测试MSP主堆栈指针 ################################################*/ __IO uint32_t a = 0x11111111; __IO uint32_t b = 0x22222222; __IO uint32_t c = 0x33333333; __IO uint32_t d = 0x44444444; __IO uint32_t e = 0x55555555; __IO uint32_t f = 0x66666666; __IO uint32_t g = 0x77777777; __IO uint32_t h = 0x88888888; // bsp_Init(); /* 硬件初始化 */ // printf("a = %x, b = %x\r\n", a, b); /*##- 测试PSP线程堆栈指针 ###############################################*/ __set_PSP(__get_MSP()); /* 设置PSP位置 */ __set_CONTROL(0x02); /* bit1 = 1表示使用PSP,bit1 = 0表示使用MSP */ { __IO uint32_t a1 = 0x11111111; __IO uint32_t b1 = 0x22222222; __IO uint32_t c1 = 0x33333333; __IO uint32_t d1 = 0x44444444; __IO uint32_t e1 = 0x55555555; __IO uint32_t f1 = 0x66666666; __IO uint32_t g1 = 0x77777777; __IO uint32_t h1 = 0x88888888; // printf("a1 = %x, b1 = %x\r\n", a1, b1); } /*##- PendSV任务切换 ####################################################*/ p_stk = &PspStack[100]; /* 硬件自动入栈 */ *(--p_stk) = (uint32_t)0x01000000; /* xPSR */ *(--p_stk) = (uint32_t)PrintfLogo; /* Entry Point */ *(--p_stk) = (uint32_t)0x00000000; /* R14 (LR) */ *(--p_stk) = (uint32_t)0xAAAAAAAA; /* R12 */ *(--p_stk) = (uint32_t)0xBBBBBBBB; /* R3 */ *(--p_stk) = (uint32_t)0xCCCCCCCC; /* R2 */ *(--p_stk) = (uint32_t)0xDDDDDDDD; /* R1 */ *(--p_stk) = (uint32_t)0xEEEEEEEE; /* R0 : argument */ /* 根据需要手动入栈的 */ *(--p_stk) = (uint32_t)0x11111111; /* R11*/ *(--p_stk) = (uint32_t)0x22222222; /* R10*/ *(--p_stk) = (uint32_t)0x33333333; /* R9 */ *(--p_stk) = (uint32_t)0x44444444; /* R8 */ *(--p_stk) = (uint32_t)0x55555555; /* R7 */ *(--p_stk) = (uint32_t)0x66666666; /* R6 */ *(--p_stk) = (uint32_t)0x77777777; /* R5 */ *(--p_stk) = (uint32_t)0x88888888; /* R4 */ /* 使能PendSV中断 */ SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; __NOP(); /*##- 测试SVC软中断 ####################################################*/ SVCTest(0x11223344, 0x55667788, 0xaabbddee); /*##- 测试非特权级 ####################################################*/ __set_CONTROL(0x01); /* bit0 = 1表示应用程序工作在非特权级模式,bit1 = 0表示应用程序工作在特权机模式 */ SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; /* 操作SCB就会进入异常 */ // bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */ // bsp_StartAutoTimer(1, 500); /* 启动1个500ms的自动重装的定时器 */ /* 进入主程序循环体 */ while (1) { // bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */ /* 判断定时器超时时间 */ // if (bsp_CheckTimer(0)) // { // /* 每隔100ms 进来一次 */ // bsp_LedToggle(1); // } // // /* 判断定时器超时时间 */ // if (bsp_CheckTimer(1)) // { // /* 每隔500ms 进来一次 */ // bsp_LedToggle(2); // bsp_LedToggle(3); // bsp_LedToggle(4); // } } } /* ********************************************************************************************************* * 函 数 名: PrintfLogo * 功能说明: 打印例程名称和例程发布日期, 接上串口线后,打开PC机的超级终端软件可以观察结果 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void PrintfLogo(void) { // printf("*************************************************************\n\r"); /* 检测CPU ID */ { uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2; CPU_Sn0 = *(__IO uint32_t*)(0x1FFF7A10); CPU_Sn1 = *(__IO uint32_t*)(0x1FFF7A10 + 4); CPU_Sn2 = *(__IO uint32_t*)(0x1FFF7A10 + 8); //printf("\r\nCPU : STM32H743XIH6, BGA240, FREQ: %dMHz\r\n", SystemCoreClock / 1000000); //printf("UID = %08X %08X %08X\n\r", CPU_Sn2, CPU_Sn1, CPU_Sn0); } /* printf("\n\r"); printf("*************************************************************\n\r"); printf("* 例程名称 : %s\r\n", EXAMPLE_NAME); // 打印例程名称 printf("* 例程版本 : %s\r\n", DEMO_VER); // 打印例程版本 printf("* 发布日期 : %s\r\n", EXAMPLE_DATE); // 打印例程日期 // 打印ST的HAL库版本 printf("* HAL库版本 : V1.3.0 (STM32H7xx HAL Driver)\r\n"); printf("* \r\n"); // 打印一行空格 printf("* QQ : 1295744630 \r\n"); printf("* 旺旺 : armfly\r\n"); printf("* Email : armfly@qq.com \r\n"); printf("* 微信公众号: armfly_com \r\n"); printf("* 淘宝店: armfly.taobao.com\r\n"); printf("* Copyright www.armfly.com 安富莱电子\r\n"); printf("*************************************************************\n\r"); */ } /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/