首页 > 编程知识 正文

arduino 串口读取16进制数据,简述stm32的启动过程

时间:2023-05-03 18:03:08 阅读:168764 作者:4850

本文介绍了如何使用STM32HAL库,以及USART-调试串行(大小侧测试)示例。

硬件: STM32F103CBT6最小系统主板

软件: Keil 5.29 STM32CubeMX6.01

另一方面,原理CPU的大端序模式和小端序模式被广泛使用,不同的硬件厂商采用不同的思路设计硬件,硬件设计不同,工作原理也不同。 之所以有大小端这个词。

大小端模式:

大字节序模式是一种存储模式,其中数据的字节存储在内存的低地址,而数据的低字节存储在内存的高地址。 这样的存储模式类似于将数据作为字符串顺序来处理。 地址从小到大增加,数据从上到下排列。 这和我们的读书习惯一致。

小端序模式是指数据的字节保存在存储器的高地址,数据的字节保存在存储器的低地址。 该内存模式有效地结合了地址高低和数据位的权重,高地址部分的权重较高,低地址部分的权重较低。

以unsigned int value=0x12345678为例,分别看两个字节序下的存储情况。 值可以用unsigned char buf[4]表示

Big-Endian: 低地址存放高位,如下:

高地址

----------------

buf[3](0x78 )--下位

buf[2](0x56 )。

buf[1](0x34 )。

buf[0](0x12 )--高位

----------------

行地址

Little-Endian: 低地址存放低位,如下:

高地址

----------------

buf[3](0x12 )--高位

buf[2](0x34 )。

buf[1](0x56 )。

buf[0](0x78 )--下位

----------------

行地址

存储器地址小端序模式存储内容大端序模式存储内容0 x 40000 x 780 x 120 x 560 x 340 x 40020 x 340 x 560 x 40030 x 120 x 78

例如:

要存储的数据:0x22334455

低字节为:0x22

高字节为:0x55

小端序模式:

中储存顺序:0x22、0x33、0x44、0x55

数据读取方向:从高位地址读取数据

读取结果:0x 55,0x 44,0x 33,0x 22

大端模式:

内存顺序:0x55、0x44、0x33、0x22

数据读取方向:从低地址读取数据

读取结果:0x 55,0x 44,0x 33,0x 22

二. STM32CubeMx的配置

三. Examples main.c号文件

/* usercodebeginheader */* * * * * * * * * * * * * * * * * * * * * * * * * beginheader * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * copyright (c ) 2021 stmight thissoftwarecomponentislicensedbystunderbsd3youmaynotusethisfileexceptincompliancewiththe * license.youmayobtainacopyofthelinacoftheliliced open source.org/licenses/licenses BSD-3-clause * * * * * * * * * * * * * * * open source.org/licenses

es ----------------------------------------------------------*//* USER CODE BEGIN Includes */#include "stdio.h"#include "string.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ *//** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch;} int fgetc(FILE * f){ uint8_t ch = 0; HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch;}typedef union{ int a; char b;}union_t;void union_test(void){union_t ut; //共用体测试 ut.a = 0x22334455;printf("*************共用体方式测试*************rn"); if(ut.b==0x22) printf(">> 编译环境为大端模式n"); if(ut.b==0x55) printf(">> 编译环境为小端模式n"); else printf(">> 程序运行出错n");}void pointer_test(void){uint8_t ch; uint8_t i,data[8]; uint32_t data_32 = 0x22334455;printf("*************指针方式测试*************rn");memcpy(data,&data_32,sizeof(uint32_t)); for(i=0;i<sizeof(uint32_t);++i) { printf("data[[%d]=0x%Xn",i,data[i]); } if(data[0]==(data_32&0x000000FF)) printf(">> 编译环境为小端模式n"); else if(data[0]==(data_32&0xFF000000)) printf(">> 编译环境为大端模式n"); else printf(">> 程序运行出错n");}/* USER CODE END 0 *//** * @brief The application entry point. * @retval int */int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */printf("HeiHei!!!n"); union_test();pointer_test(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) {HAL_Delay(1000);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}/** * @brief System Clock Configuration * @retval None */void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); }}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//** * @brief This function is executed in case of error occurrence. * @retval None */void Error_Handler(void){ /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */}#ifdef USE_FULL_ASSERT/** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */void assert_failed(uint8_t *file, uint32_t line){ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %drn", file, line) */ /* USER CODE END 6 */}#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 四、运行结果

传送门->代码

五、总结

      好了,就介绍到此。

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。