|
测试程序生成3个脉冲。第一次生成脉冲正常,第二次异常(少一个脉冲,脉宽也不对),第三次又正常。波形如下:
程序如下: uint32_t count = 0; void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) { // 检查是否为 TIM5 的 DMA if (hdma == &hdma_tim5_ch4) {
} else if (hdma == &hdma_tim23_ch1) { HAL_TIM_PWM_Stop(&htim23, TIM_CHANNEL_1); } } uint32_t pulseBuff[100] = { 200,600,1200,2000,3000,4200 }; //200--1US,400--2US,600--3US,800--4US //uint32_t pulseBuff[100] = { // 200,1000,1800,2600 //}; void Test_TIM5_FixedPulses(uint32_t pulse_count, uint32_t freq_hz) { uint32_t timer_clk = HAL_RCC_GetPCLK1Freq() 2; uint32_t arr = (timer_clk / (2 freq_hz)) - 1; if (arr < 2) arr = 2; // // 停止任何正在进行的传输 HAL_TIM_OC_Stop(&htim5, TIM_CHANNEL_4); HAL_DMA_Abort(&hdma_tim5_ch4); // 填充缓冲区 0 htim5.Instance->CNT = 0; // uint32_t temp = htim5.Instance->CNT; // for (uint32_t i = 0; i < pulse_count; i++) { // temp += i % 2 ? arr 2 : arr; // pulseBuff[2 i] = temp; // temp += i % 2 ? arr 2 : arr; // pulseBuff[2 i + 1] = temp; // } __HAL_TIM_ENABLE_DMA(&htim5, TIM_DMA_CC4); __HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE | TIM_FLAG_CC4); // 清中断标志 htim5.Instance->CNT = 0; htim5.Instance->CCR4 = pulseBuff[0]; for(volatile int i=0; i<100; i++){} // 确保 CCR4 写入完成 HAL_DMA_Start_IT(&hdma_tim5_ch4, (uint32_t) &pulseBuff[1], (uint32_t) &htim5.Instance->CCR4, pulse_count * 2-1); // TIM_CCxChannelCmd(htim5.Instance, TIM_CHANNEL_4, TIM_CCx_ENABLE); // __HAL_TIM_ENABLE(&htim5); // HAL_TIM_GenerateEvent(&htim5, TIM_EVENTSOURCE_CC4); __HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_CC4); // __HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE); HAL_TIM_OC_Start(&htim5, TIM_CHANNEL_4); } int main(void) { / USER CODE BEGIN 1 / / USER CODE END 1 / / MPU Configuration--------------------------------------------------------/ // MPU_Config(); / Enable the CPU Cache / / Enable I-Cache---------------------------------------------------------/ // SCB_EnableICache(); / 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_DMA_Init(); MX_UART9_Init(); MX_TIM5_Init(); MX_TIM23_Init(); / USER CODE BEGIN 2 / / USER CODE END 2 / / Infinite loop / / USER CODE BEGIN WHILE / while (1) { if(HAL_GetTick()%1000 == 0) { HAL_GPIO_WritePin(GPIOA, SYS_LED1_Pin, GPIO_PIN_SET); } else if(HAL_GetTick()%1000 == 500) { HAL_GPIO_WritePin(GPIOA, SYS_LED1_Pin, GPIO_PIN_RESET); } if(receiveFlag) { receiveFlag = 0; HAL_UART_Transmit(&huart9, receiveBuff, 1, 0xffff);
} / USER CODE END 3 / } void MX_TIM5_Init(void) { / USER CODE BEGIN TIM5_Init 0 / / USER CODE END TIM5_Init 0 / TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; / USER CODE BEGIN TIM5_Init 1 / / USER CODE END TIM5_Init 1 / htim5.Instance = TIM5; htim5.Init.Prescaler = 0; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = 0xFFFFFFFF; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_OC_Init(&htim5) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_TOGGLE; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_OC_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim5); / USER CODE BEGIN TIM5_Init 2 / extern void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef hdma); HAL_DMA_RegisterCallback(&hdma_tim5_ch4, HAL_DMA_XFER_CPLT_CB_ID, HAL_DMA_XferCpltCallback); / USER CODE END TIM5_Init 2 */ } void HAL_TIM_OC_MspInit(TIM_HandleTypeDef* tim_ocHandle) { if(tim_ocHandle->Instance==TIM5) { / USER CODE BEGIN TIM5_MspInit 0 /
} } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(timHandle->Instance==TIM5) { / USER CODE BEGIN TIM5_MspPostInit 0 /
} else if(timHandle->Instance==TIM23) { / USER CODE BEGIN TIM23_MspPostInit 0 /
} } |
STM32H7中FDCAN,数据正确,ID号错误
STM32H7的FDCAN
STM32CubeMX配置STM32F103C8T6 RTC分频器问题
STM32H747XIH6 CM7正常运行 CM4不能正运行
【经验分享】STM32H7 DMA+UART不定长接收实战:解决缓存溢出与数据错位问题
STM32H725的LSE不起振
请教STM32F103的DMA空闲接收问题
STM32H747XI CM7正常运行 CM4不运行
stm32h7s78-dk烧录
STM32Programmer能识别芯片,Keil无法识别
微信公众号
手机版
uint32_t count = 0; void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) { // 检查是否为 TIM5 的 DMA if (hdma == &hdma_tim5_ch4) {
} else if (hdma == &hdma_tim23_ch1) { HAL_TIM_PWM_Stop(&htim23, TIM_CHANNEL_1); } }
uint32_t pulseBuff[100] = { 200,600,1200,2000,3000,4200 }; //200--1US,400--2US,600--3US,800--4US //uint32_t pulseBuff[100] = { // 200,1000,1800,2600 //}; void Test_TIM5_FixedPulses(uint32_t pulse_count, uint32_t freq_hz) { uint32_t timer_clk = HAL_RCC_GetPCLK1Freq() 2; uint32_t arr = (timer_clk / (2 freq_hz)) - 1; if (arr < 2) arr = 2;
// // 停止任何正在进行的传输 HAL_TIM_OC_Stop(&htim5, TIM_CHANNEL_4); HAL_DMA_Abort(&hdma_tim5_ch4);
// 填充缓冲区 0 htim5.Instance->CNT = 0; // uint32_t temp = htim5.Instance->CNT; // for (uint32_t i = 0; i < pulse_count; i++) { // temp += i % 2 ? arr 2 : arr; // pulseBuff[2 i] = temp; // temp += i % 2 ? arr 2 : arr; // pulseBuff[2 i + 1] = temp;
// }
__HAL_TIM_ENABLE_DMA(&htim5, TIM_DMA_CC4);
__HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE | TIM_FLAG_CC4); // 清中断标志
htim5.Instance->CNT = 0; htim5.Instance->CCR4 = pulseBuff[0]; for(volatile int i=0; i<100; i++){} // 确保 CCR4 写入完成 HAL_DMA_Start_IT(&hdma_tim5_ch4, (uint32_t) &pulseBuff[1], (uint32_t) &htim5.Instance->CCR4, pulse_count * 2-1); // TIM_CCxChannelCmd(htim5.Instance, TIM_CHANNEL_4, TIM_CCx_ENABLE); // __HAL_TIM_ENABLE(&htim5);
// HAL_TIM_GenerateEvent(&htim5, TIM_EVENTSOURCE_CC4);
__HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_CC4); // __HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE);
HAL_TIM_OC_Start(&htim5, TIM_CHANNEL_4); }
void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) {
// 检查是否为 TIM5 的 DMA
if (hdma == &hdma_tim5_ch4) {
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) && count++ < 10000);
HAL_TIM_OC_Stop(&htim5, TIM_CHANNEL_4);
HAL_DMA_Abort(&hdma_tim5_ch4);
if(count >= 10000)
count = 0;
}
else if (hdma == &hdma_tim23_ch1) {
HAL_TIM_PWM_Stop(&htim23, TIM_CHANNEL_1);
}
}
uint32_t pulseBuff[100] = {
200,600,1200,2000,3000,4200
}; //200--1US,400--2US,600--3US,800--4US
//uint32_t pulseBuff[100] = {
// 200,1000,1800,2600
//};
void Test_TIM5_FixedPulses(uint32_t pulse_count, uint32_t freq_hz) {
uint32_t timer_clk = HAL_RCC_GetPCLK1Freq() * 2;
uint32_t arr = (timer_clk / (2 * freq_hz)) - 1;
if (arr < 2) arr = 2;
// // 停止任何正在进行的传输
HAL_TIM_OC_Stop(&htim5, TIM_CHANNEL_4);
HAL_DMA_Abort(&hdma_tim5_ch4);
// 填充缓冲区 0
htim5.Instance->CNT = 0;
// uint32_t temp = htim5.Instance->CNT;
// for (uint32_t i = 0; i < pulse_count; i++) {
// temp += i % 2 ? arr * 2 : arr;
// pulseBuff[2 * i] = temp;
// temp += i % 2 ? arr * 2 : arr;
// pulseBuff[2 * i + 1] = temp;
// }
__HAL_TIM_ENABLE_DMA(&htim5, TIM_DMA_CC4);
__HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE | TIM_FLAG_CC4); // 清中断标志
htim5.Instance->CNT = 0;
htim5.Instance->CCR4 = pulseBuff[0];
for(volatile int i=0; i<100; i++){} // 确保 CCR4 写入完成
HAL_DMA_Start_IT(&hdma_tim5_ch4, (uint32_t) &pulseBuff[1],
(uint32_t) &htim5.Instance->CCR4, pulse_count * 2-1);
// TIM_CCxChannelCmd(htim5.Instance, TIM_CHANNEL_4, TIM_CCx_ENABLE);
// __HAL_TIM_ENABLE(&htim5);
// HAL_TIM_GenerateEvent(&htim5, TIM_EVENTSOURCE_CC4);
__HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_CC4);
// __HAL_TIM_CLEAR_FLAG(&htim5, TIM_FLAG_UPDATE);
HAL_TIM_OC_Start(&htim5, TIM_CHANNEL_4);
}
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MPU Configuration--------------------------------------------------------*/
// MPU_Config();
/* Enable the CPU Cache */
/* Enable I-Cache---------------------------------------------------------*/
// SCB_EnableICache();
/* 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_DMA_Init();
MX_UART9_Init();
MX_TIM5_Init();
MX_TIM23_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GetTick()%1000 == 0)
{
HAL_GPIO_WritePin(GPIOA, SYS_LED1_Pin, GPIO_PIN_SET);
}
else if(HAL_GetTick()%1000 == 500)
{
HAL_GPIO_WritePin(GPIOA, SYS_LED1_Pin, GPIO_PIN_RESET);
}
if(receiveFlag)
{
receiveFlag = 0;
HAL_UART_Transmit(&huart9, receiveBuff,
1, 0xffff);
static uint8_t flag = 0;
if(flag == 0)
{
flag = 1;
Test_TIM5_FixedPulses(3, 5000);
}
else
{
flag = 0;
Test_TIM5_FixedPulses(3, 50000);
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
{
/* USER CODE BEGIN TIM5_Init 0 */
/* USER CODE END TIM5_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM5_Init 1 */
/* USER CODE END TIM5_Init 1 */
htim5.Instance = TIM5;
htim5.Init.Prescaler = 0;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = 0xFFFFFFFF;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_OC_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim5);
/* USER CODE BEGIN TIM5_Init 2 */
extern void HAL_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma);
HAL_DMA_RegisterCallback(&hdma_tim5_ch4, HAL_DMA_XFER_CPLT_CB_ID,
HAL_DMA_XferCpltCallback);
/* USER CODE END TIM5_Init 2 */
}