找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34|回复: 0
打印 上一主题 下一主题
收起左侧

关于在调试stm32时对IDE和stm32cubemx+IAR的一些心得和程序源码

[复制链接]
跳转到指定楼层
楼主
ID:1027065 发表于 2026-7-30 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1s定时器。
HAL_TIM_Base_Start_IT(&htim6);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim->Instance==TIM6)
        {
                static uint16_t index = 0;
                TIM1->CCR1 = sine_table[index];
                TIM1->CCR2 = 900U - sine_table[index];
                index = (index + 1U) % 100U;
                TIMFLAG=1;
        }
}





uint16_t adc_value[2];
  float voltage_in0=0;
  float voltage_in1=0;
  HAL_ADCEx_Calibration_Start(&hadc1);
  HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_value,2);   
     voltage_in0 = adc_value[0] * 3.28f / 4095.0f;
        voltage_in1 = adc_value[1] * 3.28f / 4095.0f;
        printf("voltage_in0:%.3f,voltage_in1:%.3f\r\n",voltage_in0,voltage_in1);


uint32_t last_tick = 0;
if (HAL_GetTick() - last_tick >= 1000)
        {
          last_tick = HAL_GetTick();
    voltage_in0 = adc_value[0] * 3.28f / 4095.0f;
        voltage_in1 = adc_value[1] * 3.28f / 4095.0f;
        printf("voltage_in0:%.3f,voltage_in1:%.3f\r\n",voltage_in0,voltage_in1);

        }


打印浮点数
IDE
#include <stdio.h>
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
printf("nihaopgg\r\n");
IAR

#include <stdio.h>
size_t __write(int handle, const unsigned char *buffer, size_t size)
{
(void)handle;
HAL_UART_Transmit(&huart1, (uint8_t *
)buffer, size, HAL_MAX_DELAY);
return size;
}
串口发送数据#include "string.h"
#include "stdlib.h"
uint8_t rxBuf[7];
if (HAL_UART_Receive(&huart1, rxBuf, 7, 10) == HAL_OK)
{
// HAL_UART_Transmit(&huart1, rxBuf, 7, 100);
rxBuf[5] = '\0';
b = atof((char *)rxBuf);
printf("b:%.3f\r\n",b);
// PID_SetTarget(&dac_pid,b*4095/3.3);
PID_SetTarget(&dac_pid,b);
if (strcmp((char *)rxBuf, "2.000") == 0)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}
打开输入捕获中断
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);
ADC相关
HAL_ADCEx_Calibration_Start(&hadc1);  //启动内部校准
HAL_ADC_Start(&hadc3); // 先启动转换
HAL_ADC_PollForConversion(&hadc3, 10); // 等待转换完成
adcval1=HAL_ADC_GetValue(&hadc3);
DAC相关
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 1888);
注意DAC不要开始软件触发   否则需 // DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1; 才能触发
PID相关
PID.c PID.h 复制过来
float piddac=0;
PID_TypeDef dac_pid;;
PID_Init(&dac_pid, 1025.0f, 125.00f, 0.0f);
piddac=PID_Calc(&dac_pid,adcval);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, piddac);
或    TIM1->CCR1=piddac;
ADC+DMA+采完回调
uint16_t adc_buf[GOERTZEL_BUFFER_SIZE];
HAL_ADCEx_Calibration_Start(&hadc1);                             //校准ADC
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buf, GOERTZEL_BUFFER_SIZE);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
static uint8_t first_block = 1;
if(hadc->Instance == ADC1)
{
if (first_block == 1)
{
first_block = 0;
return;
}
memcpy(analysis_buf, adc_buf, sizeof(analysis_buf));
tx_index++;
if (tx_index == 8)
{
tx_index = 0;
}
BFSK_Send_Bit(tx_data[tx_index]);
uint8_t bit = Goertzel_Detect(analysis_buf);
Receive_Bit(bit);
}
}
DAC+DMA
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)samples,
sample_count, DAC_ALIGN_12B_R);
PWM互补输出
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); //要启动两次
/
Prescaler      -> TIM1->PSC    // 预分频值
Period         -> TIM1->ARR    // PWM周期
Pulse CH1      -> TIM1->CCR1   // CH1占空比
Pulse CH2      -> TIM1->CCR2
Pulse CH3      -> TIM1->CCR3
Pulse CH4      -> TIM1->CCR4
当前计数值      -> TIM1->CNT
/

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表