2301_81173072 2024-11-12 19:26 采纳率: 63.6%
浏览 22
已结题

用keil,写代码解决两个问题,用库函数

一,在0.1秒内检测脉冲的个数(上升沿)
1.定时器定时0.1秒
2.利用定时器从模式,对脉冲进行统计,结果存放在主函数的一个变量中即可,定义即可不用做处理
3.脉冲为TIM2通过pa0口输出的PWM波,输入口为 pa6口,用TIM3
4.结果控制在0-9
5.代码写在两个点c文件中。一个叫IC.c,一个叫PWM.c。
二,利用串口控制嵌入式系统。
1.实现串口与ST m32的通讯。可以发送0~9,10个数字。
2.使用笔记本的按键代替原来焊接的按键。按键有两根针。需要连两根线。
3.如果本实验除STM32F103单片机之外的设备.或者需要在电脑中下载其他软件,请详细展示。

最后写出两个代码的设计思路个代码解析

img

img

  • 写回答

23条回答 默认 最新

  • 专家-皆知 2024-11-12 19:27
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    解决方案一:检测脉冲个数

    PWM.c (负责产生PWM信号)

    #include "stm32f1xx_hal.h"
    
     TIM_HandleTypeDef htim_pwm;
    
    void PWM_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        TIM_MasterConfigTypeDef sMasterConfig = {0};
    
        // 配置PA0作为PWM输出
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 初始化TIM2
        htim_pwm.Instance = TIM2;
        htim_pwm.Init.Prescaler = 84 - 1; // 假设系统时钟为72MHz,得到1MHz的计数频率
        htim_pwm.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim_pwm.Init.Period = 999; // 这里设定PWM周期
        htim_pwm.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        if (HAL_TIM_PWM_Init(&htim_pwm) != HAL_OK) {
            Error_Handler();
        }
    
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        HAL_TIM_PWM_ConfigMasterSlaveMode(&htim_pwm, &sMasterConfig);
    
        HAL_TIM_PWM_Start(&htim_pwm, TIM_CHANNEL_1); // 开始PWM
    }
    
    void PWM_Deinit(void) {
        HAL_TIM_PWM_Stop(&htim_pwm, TIM_CHANNEL_1);
        HAL_TIM_PWM_DeInit(&htim_pwm);
    }
    

    IC.c (负责检测脉冲并计数)

    #include "stm32f1xx_hal.h"
    
    TIM_HandleTypeDef htim_pulse;
    volatile uint8_t pulse_count = 0;
    
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
        if (htim == &htim_pulse && htim->Instance == TIM3) {
            pulse_count++; // 每检测到一次上升沿,脉冲计数加1
            if (pulse_count > 9) { // 控制计数在0-9范围内
                pulse_count = 0;
            }
        }
    }
    
    void PulseCounter_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        TIM_IC_InitTypeDef sConfigIC = {0};
    
        // 配置PA6作为TIM3的输入捕获
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 初始化TIM3
        htim_pulse.Instance = TIM3;
        htim_pulse.Init.Prescaler = 84 - 1; // 同样使用1MHz计数频率
        htim_pulse.Init.CounterMode = TIM_COUNTERMODE_UP;
        htim_pulse.Init.Period = 9999; // 较大的周期以防止溢出
        htim_pulse.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
        if (HAL_TIM_IC_Init(&htim_pulse) != HAL_OK) {
            Error_Handler();
        }
    
        sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; // 只检测上升沿
        sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
        sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
        sConfigIC.ICFilter = 0;
        HAL_TIM_IC_ConfigChannel(&htim_pulse, &sConfigIC, TIM_CHANNEL_1); // 使用CH1
    
        HAL_TIM_IC_Start_IT(&htim_pulse, TIM_CHANNEL_1); // 开启中断
    }
    
    void PulseCounter_Deinit(void) {
        HAL_TIM_IC_Stop_IT(&htim_pulse, TIM_CHANNEL_1);
        HAL_TIM_IC_DeInit(&htim_pulse);
    }
    

    解决方案二:串口通讯

    在STM32项目中,你需要创建一个新的C文件,比如SerialCom.c,并且在对应的头文件SerialCom.h中声明相关函数。这里仅提供关键的初始化和接收处理部分:

    SerialCom.c

    #include "stm32f1xx_hal.h"
    #include "SerialCom.h"
    
    UART_HandleTypeDef huart1;
    
    void SerialCom_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        UART_HandleTypeDef huart;
    
        // 配置USART1的GPIO
        GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; // TX, RX
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 配置USART1
        huart.Instance = USART1;
        huart.Init.BaudRate = 115200;
        huart.Init.WordLength = UART_WORDLENGTH_8B;
        huart.Init.StopBits = UART_STOPBITS_1;
        huart.Init.Parity = UART_PARITY_NONE;
        huart.Init.Mode = UART_MODE_TX_RX;
        huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart.Init.OverSampling = UART_OVERSAMPLING_16;
        if (HAL_UART_Init(&huart1) != HAL_OK) {
            Error_Handler();
        }
    }
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart == &huart1) {
            uint8_t received_data = huart->Instance->DR; // 获取接收到的数据
            if(received_data >= '0' && received_data <= '9') {
                // 处理接收到的数字,例如打印或控制其他功能
                printf("Received: %c\n", received_data);
            }
        }
    }
    

    SerialCom.h

    #ifndef SERIALCOM_H
    #define SERIALCOM_H
    
    void SerialCom_Init(void);
    
    #endif /* SERIALCOM_H */
    

    注意:在实际应用中,你需要确保包含这些文件到你的工程中,并且正确配置STM32CubeMX生成的启动文件和系统时钟配置。此外,串口通信中的中断处理函数HAL_UART_RxCpltCallback是示例性的,实际应用中可能需要更复杂的逻辑来处理数据。关于电脑端的串口通讯软件,常见的有PuTTY、SecureCRT等,用户可以通过这些软件设置相应的波特率与单片机通讯,无需额外下载软件除这些串口调试工具外。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月15日
  • 修改了问题 11月12日
  • 创建了问题 11月12日

悬赏问题

  • ¥15 centos7中sudo命令无法使用
  • ¥15 灰狼算法和蚁群算法如何结合
  • ¥15 这是一个利用ESP32自带按键和LED控制的录像代码,编译过程出现问题,请解决并且指出错误,指导如何处理 ,协助完成代码并上传代码
  • ¥20 stm32f103,hal库 hal_usart_receive函数接收不到数据。
  • ¥20 求结果和代码,sas利用OPTEX程序和D-efficiency生成正交集
  • ¥50 adb连接不到手机是怎么回事?
  • ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?
  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联
  • ¥15 VB.NET操作免驱摄像头