[i=s] 本帖最后由 uuguoleilei 于 2025-5-23 19:56 编辑 [/i]<br />
<br />
拿到板子,就有出厂程序,将typec接上就有灯亮,很顺畅

配置环境需要准备安装包和开发板固件,也就是demo
编译ide可以在官网下载
以下是固件下载链接
STM32CubeC0 - STM32Cube MCU Package for STM32C0 series (HAL, Low-Layer APIs and CMSIS, File system, RTOS - and examples running on ST boards) - STMicroelectronics
以下可以配置相关引脚和对应的时钟,需要通过b站学习一下,学过的可以直接用

配置好点下面这个按键,就可以直接生成代码了,生成好代码就可以开始编译和下载,注意这里接的typec线需要带有数据传输功能,不然就会识别不到stlink

如下是写好代码后,就点击这个锤子编译,

也可以像下面这样配置,就可以将ide进行汉化了,非常方便

输入这个地址Babel Language Pack Metadata Repository - https://download.eclipse.org/technology/babel/update-site/R0.17.1/2019-12/,按下回车,然后浏览一下下面的库,就找到了简体中文,勾选上点next,就基本安装好了,重启ide就汉化界面了

虽然配置也可以,那还是放一下代码吧,
以下是初始化代码
// 配置UART2外设实例
huart2.Instance = USART2;
// 配置波特率为115200bps huart2.Init.BaudRate = 115200;
// 配置数据位长度为8位 huart2.Init.WordLength = UART_WORDLENGTH_8B;
// 配置停止位为1位 huart2.Init.StopBits = UART_STOPBITS_1;
// 配置不使用奇偶校验 huart2.Init.Parity = UART_PARITY_NONE;
// 配置为收发模式 huart2.Init.Mode = UART_MODE_TX_RX;
// 配置不使用硬件流控制(如RTS/CTS) huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
// 配置过采样为16倍,提高采样精度 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
// 配置禁用一位采样模式 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
// 配置UART时钟预分频为1 huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
// 配置不使用高级特性(如自动波特率检测、MSB优先等) huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
以下是应用代码
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); // 初始化HAL库,配置系统中断优先级组
/* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); // 配置系统时钟,设置CPU频率、AHB/APB总线分频等 /* USER CODE BEGIN SysInit */ /* Initialize BSP Led for LED2 */
BSP_LED_Init(LED2); // 初始化板载LED2 /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init(); // 初始化GPIO外设
MX_USART2_UART_Init(); // 初始化USART2串口 /* USER CODE BEGIN 2 */ /* Output a message on Hyperterminal using printf function */ printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
printf("** Test finished successfully. ** \n\r"); /* USER CODE END 2 */
data = 0x55; // 初始化要发送的数据为0x55
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */
HAL_Delay(100); // 延时100毫秒
uint8_t data0 = data; // 复制数据到临时变量 //
printf("** Test finished successfully. ** /r/n");
printf("%d\r\n", data0);
HAL_UART_Transmit(&huart2, &data0, 1, 0xffff); // 通过USART2发送1字节数据,超时时间为0xFFFF /* USER CODE BEGIN 3 */ }
完成配置后,就点击下面这个图标,将代码下载到板子上

配置这个选项可以在每次下载时就编译一次,可选可不选

下面的控制台可以看到下载的log,如下就是下载完成了

打开串口工具看看数据
可以看到0x55已经发出来了

什么,你问我其他数据是什么,我也不知道,你说为啥

串口打印完了
灯也点完了
完了我没有创新想法怎么办
真的是哦豁了
可以看一下can的驱动
来看一下吧,还是算了,突然有想法了。
用串口数据写flash
我先打开flash的demo看看
/* USER CODE BEGIN 2 */
BSP_LED_Init(LED1); // 初始化LED1(通常作为状态指示)
BSP_LED_Init(LED2); // 初始化LED2(通常作为错误指示)
#if !defined (GENERATOR_STM32WL3XX)
HAL_FLASH_Unlock(); // 解锁Flash以允许编程操作
#endif /* ! GENERATOR_STM32WL3XX */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); // 清除选项字节验证错误标志
FirstPage = GetPage(FLASH_USER_START_ADDR); // 计算起始擦除页号
NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1; // 计算要擦除的页数
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; // 选择页擦除模式
EraseInitStruct.Page = FirstPage; // 设置起始页
EraseInitStruct.NbPages = NbOfPages; // 设置页数
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
you have to make sure that these data are rewritten before they are accessed during code
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
DCRST and ICRST bits in the FLASH_CR register. */
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
/*
Error occurred while page erase.
User can add here some code to deal with this error.
PageError will contain the faulty page and then to know the code error on this page,
user can call function 'HAL_FLASH_GetError()'
*/
while (1)
{
Error_Handler(); // 擦除失败时进入错误处理循环
}
}
Address = FLASH_USER_START_ADDR; // 设置编程起始地址
while (Address < FLASH_USER_END_ADDR)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, DATA_64) == HAL_OK)
{
Address = Address + 8; /* increment to next double word*/ // 双字编程成功后地址增加8字节
}
else
{
/* Error occurred while writing data in Flash memory.
User can add here some code to deal with this error */
while (1)
{
Error_Handler(); // 编程失败时进入错误处理循环
}
}
}
#if !defined (GENERATOR_STM32WL3XX)
HAL_FLASH_Lock(); // 锁定Flash防止意外操作
#endif /* ! GENERATOR_STM32WL3XX */
Address = FLASH_USER_START_ADDR; // 设置验证起始地址
MemoryProgramStatus = 0x0; // 初始化验证状态
while (Address < FLASH_USER_END_ADDR)
{
data32 = *(__IO uint32_t *)Address; // 读取Flash中的数据
if (data32 != DATA_32)
{
MemoryProgramStatus++; // 验证失败时增加错误计数
}
Address = Address + 4; // 地址增加4字节(单字)
}
if(MemoryProgramStatus != 0)
{
BSP_LED_On(LED2); // 验证失败时点亮LED2(错误指示)
}
else
{
BSP_LED_On(LED1); // 验证成功时点亮LED1(成功指示)
}
可以检查一下对应地址发现确实是擦除了的

如下图是成功擦写了12345678

下面的逻辑就是逻辑检查了
`while (Address < FLASH_USER_END_ADDR)
{
data32 = (__IO uint32_t )Address; // 读取当前地址的32位数据
if (data32 != DATA_32) // 比较读取值与预期值
{
MemoryProgramStatus++; // 若不匹配,错误计数器加1
}
Address = Address + 4; // 指向下一个32位地址(+4字节)
}`
可以看一下这个计数器有没有变化,可以看到断点在以下,就没变过,怎么可能擦除出错,这样就可以用串口来擦写数据了

那就来试试吧
首先加入串口的初始化
不会用stm32ide,这个项目难产了,下一个
串口打印adc