这个是实验的终端输出:
这个是demo的没有修改时现象:
修改后的现象就是串口输出的那个图片,视频的现象比较一致?
下面提供代码:
- /**
- *
- * [url=/u/file]@file[/url] main.c
- *
- * [url=/u/brief]@brief[/url] Main program body
- *
- * [url=/u/version]@version[/url] V1.0.0
- *
- * [url=/u/date]@date[/url] 2025-10-30
- *
- * @attention
- *
- * Copyright (C) 2025 Geehy Semiconductor
- *
- * You may not use this file except in compliance with the
- * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
- *
- * The program is only for reference, which is distributed in the hope
- * that it will be useful and instructional for customers to develop
- * their software. Unless required by applicable law or agreed to in
- * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
- * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
- * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
- * and limitations under the License.
- */
- /* Includes ***************************************************************/
- #include "main.h"
- /* Private includes *******************************************************/
- #include "g32r4xx_ddl_usart.h"
- #include <stdio.h>
- /* Private macro **********************************************************/
- /* Private typedef ********************************************************/
- /* Private variables ******************************************************/
- /* 定义中断计数器 */
- volatile uint32_t eint1_cnt = 0;
- volatile uint32_t eint2_cnt = 0;
- volatile uint8_t eint1_flag = 0; // 增加标志位
- volatile uint8_t eint2_flag = 0; // 增加标志位
- /* Private function prototypes ********************************************/
- void DDL_SysClkConfig(void);
- void GPIO_Init(void);
- void EINT1_Isr(void);
- void EINT2_Isr(void);
- /* 1. 在文件顶部定义标准中断函数名,绕过注册 API */
- void EINT1_IRQHandler(void);
- void EINT2_IRQHandler(void);
- /* External variables *****************************************************/
- /* External functions *****************************************************/
- /**
- * @brief Main program
- *
- * @param None
- *
- * @retval None
- *
- */
- // int main(void) {
- // /* Configure system clock */
- // DDL_SysClkConfig();
- // /* Configure interrupt group 4: 4-bit preemptive priority, 0-bit
- // subpriority
- // */
- // DDL_NVIC_ConfigPriorityGroup(DDL_NVIC_PRIORITY_GROUP_4);
- // /* Initialize LEDs */
- // BOARD_LEDInit(LED1);
- // BOARD_LEDInit(LED2);
- // /* Turn off LEDs */
- // BOARD_LEDOff(LED1);
- // BOARD_LEDOff(LED2);
- // /* Initialize GPIO as EINT */
- // GPIO_Init();
- // while (1) {
- // }
- // }
- // int main(void) {
- // DDL_USART_InitTypeDef USART_InitStruct = {0U};
- // /* 1. 直接解锁时钟,但不配置 HSE/PLL (默认使用内部时钟) */
- // DDL_RCM_Unlock();
- // // 暂时跳过 DDL_SysClkConfig(); 看看是不是卡在那里了
- // /* 2. 初始化串口 */
- // USART_InitStruct.BaudRate = 115200U;
- // USART_InitStruct.DataWidth = DDL_USART_DATAWIDTH_8B;
- // USART_InitStruct.StopBits = DDL_USART_STOPBITS_1;
- // USART_InitStruct.Parity = DDL_USART_PARITY_NONE;
- // USART_InitStruct.TransferDirection = DDL_USART_DIRECTION_TX_RX;
- // USART_InitStruct.HardwareFlowControl = DDL_USART_HWCONTROL_NONE;
- // USART_InitStruct.OverSampling = DDL_USART_OVERSAMPLING_16;
- // /* 3. 使用默认配置初始化 */
- // BOARD_COMInit(COM2, &USART_InitStruct);
- // /* 4. 点亮一个 LED 证明程序在跑 */
- // BOARD_LEDInit(LED1);
- // BOARD_LEDOn(LED1);
- // while (1) {
- // /* 直接通过底层 API 发送一个字符 'A' 验证硬件是否连接 */
- // DDL_USART_TransmitData8(USART2, (uint8_t)'A');
- // /* 等待发送寄存器为空 */
- // while (DDL_USART_IsActiveFlag_TXE(USART2) == RESET)
- // ;
- // printf("Hello! I am alive! eint1_cnt = %d\r\n", eint1_cnt);
- // BOARD_LEDToggle(LED1);
- // for (volatile int i = 0; i < 1000000; i++)
- // ;
- // }
- // }
- int main(void) {
- DDL_SysClkConfig();
- DDL_USART_InitTypeDef USART_InitStruct = {0U};
- /* 1. 解锁并配置系统时钟 (如果之前卡死,可以暂时用内部时钟) */
- DDL_RCM_Unlock();
- DDL_SysClkConfig();
- /* 2. 初始化串口 */
- USART_InitStruct.BaudRate = 115200U;
- USART_InitStruct.DataWidth = DDL_USART_DATAWIDTH_8B;
- USART_InitStruct.StopBits = DDL_USART_STOPBITS_1;
- USART_InitStruct.Parity = DDL_USART_PARITY_NONE;
- USART_InitStruct.TransferDirection = DDL_USART_DIRECTION_TX_RX;
- USART_InitStruct.HardwareFlowControl = DDL_USART_HWCONTROL_NONE;
- USART_InitStruct.OverSampling = DDL_USART_OVERSAMPLING_16;
- BOARD_COMInit(COM2, &USART_InitStruct);
- /* 3. 配置中断分组 (这步非常关键,否则中断可能不响应) */
- DDL_NVIC_ConfigPriorityGroup(DDL_NVIC_PRIORITY_GROUP_4);
- /* 4. 初始化 LED 和 外部中断 GPIO */
- BOARD_LEDInit(LED1);
- BOARD_LEDInit(LED2);
- GPIO_Init(); // 这一步会配置 PC1/PC2 为中断源
- printf("\r\n--- 外部中断 (EINT) 计数器测试正式开始 ---\r\n");
- while (1) {
- // 心跳包,证明没死机
- BOARD_LEDToggle(LED1);
- // 在主循环中处理中断打印,避免在中断内打印
- if (eint1_flag) {
- eint1_flag = 0;
- printf("EINT1 (PC1) Triggered! Total: %d\r\n", eint1_cnt);
- }
- if (eint2_flag) {
- eint2_flag = 0;
- printf("EINT2 (PC2) Triggered! Total: %d\r\n", eint2_cnt);
- }
- for (volatile int i = 0; i < 5000000; i++)
- ;
- }
- }
- /**
- * @brief System clock configuration
- *
- * @param None
- *
- * @retval None
- */
- void DDL_SysClkConfig(void) {
- /* Unlock clock control registers */
- /* Wait until the registers are unlocked */
- DDL_RCM_Unlock();
- while ((RCM->KEY & RCM_KEY_KEYST) != RCM_KEY_KEYST) {
- }
- /* Enable HSE and wait for ready */
- /* Enable HSE input clock */
- DDL_RCM_HSE_Enable();
- /* Wait until HSE is ready */
- while (DDL_RCM_HSE_IsReady() != 1) {
- /* wait for HSERDY */
- }
- /* Configure Flash wait states appropriate for 120 MHz */
- /* Set Flash wait period to accommodate higher frequency */
- DDL_FLASH_SetWaitPeriod(FLASH_DDL_WAIT_PERIOD_3);
- /* Set Flash erase time base to 120 MHz (use 119 to represent 120 MHz) */
- DDL_FLASH_SetEraseTimeBase(119);
- /* Configure PLL */
- /* Ensure PLL is disabled prior to configuration */
- DDL_RCM_PLL_Disable();
- /* Configure PLL settings: multiplier, prescaler, and clock source */
- /* PLL multiplier set to 15 (x15), prescaler no division, clock source from
- * HSE */
- DDL_RCM_PLL_SetMultiplier(15);
- DDL_RCM_PLL_SetPrescaler(DDL_RCM_PLL_DIV1);
- DDL_RCM_PLL_SetClkSource(DDL_RCM_PLL_CLKSOURCE_HSE);
- /* Enable PLL and wait for ready */
- DDL_RCM_PLL_Enable();
- while (DDL_RCM_PLL_IsReady() != 1) {
- /* wait for PLL Ready */
- }
- /* Switch system clock to PLL output */
- DDL_RCM_SetSysClkSource(DDL_RCM_SYS_CLKSOURCE_PLL);
- /* Enable clock switch and wait for completion */
- DDL_RCM_EnableSysClkSwitch();
- while (DDL_RCM_IsActiveFlag_SWDONE() != 1) {
- }
- /* Set AHB, APB prescalers */
- DDL_RCM_SetAHBPrescaler(DDL_RCM_AHB_DIV_1);
- DDL_RCM_SetAPBPrescaler(DDL_RCM_APB_DIV_1);
- /* Disable clock switch controls */
- DDL_RCM_DisableSysClkSwitch();
- /* Lock clock control registers */
- DDL_RCM_Unlock();
- /* Update SystemCoreClock if used by the project */
- SystemCoreClockUpdate();
- }
- /*!
- * @brief ADC Init
- *
- * @param None
- *
- * @retval None
- */
- void GPIO_Init(void) {
- DDL_GPIO_InitTypeDef GPIO_InitStruct = {0U};
- DDL_EINT_InitTypeDef EINT_InitStruct = {0U};
- /* Config Clock */
- DDL_RCM_Unlock();
- DDL_RCM_EnableAHBPeripheral(DDL_RCM_AHB_PERIPHERAL_GPIO);
- DDL_RCM_EnableAPBPeripheral(DDL_RCM_APB_PERIPHERAL_EINT);
- DDL_RCM_Lock();
- /* Config PC1, PC2 as EINT */
- GPIO_InitStruct.Pin = DDL_GPIO_PIN_1 | DDL_GPIO_PIN_2;
- GPIO_InitStruct.Mode = DDL_GPIO_MODE_INPUT;
- GPIO_InitStruct.Speed = DDL_GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.OutputType = DDL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = DDL_GPIO_PULL_UP;
- GPIO_InitStruct.Alternate = DDL_GPIO_AF_0;
- DDL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /* Set EINT line source to port C */
- DDL_EINT_SetLineSource(DDL_EINT_LINE_1, DDL_EINT_LINE_SOURCE_GPIOC);
- DDL_EINT_SetLineSource(DDL_EINT_LINE_2, DDL_EINT_LINE_SOURCE_GPIOC);
- /* Config EINT */
- EINT_InitStruct.Line = DDL_EINT_LINE_1 | DDL_EINT_LINE_2;
- EINT_InitStruct.LineCommand = ENABLE;
- EINT_InitStruct.Mode = DDL_EINT_MODE_IT;
- EINT_InitStruct.Trigger = DDL_EINT_TRIGGER_FALLING;
- DDL_EINT_Init(&EINT_InitStruct);
- DDL_Interrupt_Register(EINT1_IRQn, EINT1_Isr);
- DDL_Interrupt_Register(EINT2_IRQn, EINT2_Isr);
- DDL_NVIC_EnableIRQRequest(EINT1_IRQn, 0, 0);
- DDL_NVIC_EnableIRQRequest(EINT2_IRQn, 0, 0);
- }
- /*!
- * @brief EINT0 interrupt service routine
- *
- * @param None
- *
- * @retval None
- */
- // void EINT1_Isr(void)
- // {
- // if (DDL_EINT_ReadFlag(DDL_EINT_LINE_1))
- // {
- // BOARD_LEDToggle(LED1);
- // DDL_EINT_ClearFlag(DDL_EINT_LINE_1);
- // }
- // }
- // /*!
- // * @brief EINT1 interrupt service routine
- // *
- // * @param None
- // *
- // * @retval None
- // */
- // void EINT2_Isr(void)
- // {
- // if (DDL_EINT_ReadFlag(DDL_EINT_LINE_2))
- // {
- // BOARD_LEDToggle(LED2);
- // DDL_EINT_ClearFlag(DDL_EINT_LINE_2);
- // }
- // }
- // void EINT1_Isr(void) {
- // if (DDL_EINT_ReadFlag(DDL_EINT_LINE_1)) {
- // eint1_cnt++; // 计数器加 1
- // BOARD_LEDToggle(LED1); // 翻转 LED1 状态
- // /*
- // 实时通过串口打印当前计数值(注意:生产环境不建议在中断里打印,测试可以)
- // */
- // printf("EINT1 (PC1) Triggered! Total: %d\r\n", eint1_cnt);
- // DDL_EINT_ClearFlag(DDL_EINT_LINE_1); // 清除中断标志
- // }
- // }
- void EINT1_Isr(void) {
- if (DDL_EINT_ReadFlag(DDL_EINT_LINE_1)) {
- eint1_cnt++;
- eint1_flag = 1; // 通知主循环打印
- DDL_EINT_ClearFlag(DDL_EINT_LINE_1);
- }
- }
- void EINT2_Isr(void) {
- if (DDL_EINT_ReadFlag(DDL_EINT_LINE_2)) {
- eint2_cnt++;
- eint2_flag = 1; // 通知主循环打印
- BOARD_LEDToggle(LED2);
- DDL_EINT_ClearFlag(DDL_EINT_LINE_2);
- }
- }
- /* 5. 核心:直接实现硬件中断函数名 (由 startup_g32r4xx.s 调用) */
- void EINT1_IRQHandler(void) {
- if (DDL_EINT_ReadFlag(DDL_EINT_LINE_1)) {
- eint1_cnt++;
- BOARD_LEDToggle(LED2); // 触发时 LED2 闪烁
- DDL_USART_TransmitData8(USART2, '!'); // 触发时发个感叹号
- DDL_EINT_ClearFlag(DDL_EINT_LINE_1);
- }
- }
- /* 5. 核心:直接实现硬件中断函数名 (由 startup_g32r4xx.s 调用) */
- void EINT2_IRQHandler(void) {
- if (DDL_EINT_ReadFlag(DDL_EINT_LINE_2)) {
- eint2_cnt++;
- BOARD_LEDToggle(LED2); // 触发时 LED2 闪烁
- DDL_USART_TransmitData8(USART2, '!'); // 触发时发个感叹号
- DDL_EINT_ClearFlag(DDL_EINT_LINE_2);
- }
- }
- /* ========================================================================= */
- /* printf 重定向 (解决不输出和卡死的核心) */
- /* ========================================================================= */
- #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
- int fputc(int ch, FILE *f) {
- /* 假设你用的是 USART2,如果不是请修改 */
- DDL_USART_TransmitData8(USART2, (uint8_t)ch);
- while (DDL_USART_IsActiveFlag_TXE(USART2) == RESET)
- ;
- return ch;
- }
- #elif defined(__ICCARM__)
- int __io_putchar(int ch) {
- DDL_USART_TransmitData8(USART2, (uint8_t)ch);
- while (DDL_USART_IsActiveFlag_TXE(USART2) == RESET)
- ;
- return ch;
- }
- int __write(int file, char *ptr, int len) {
- int i;
- for (i = 0; i < len; i++) {
- __io_putchar(*ptr++);
- }
- return len;
- }
- #endif
下次看看有没有什么其他的
|