如何在 2 个 Stm32 之间建立 UART 通信并产生 PWM 信号
How Can I Establish UART Communication between 2 Stm32 and produce PWM signal
编辑:我解决了 UART 通信问题,但我在接收传输数据后获取 pwm 信号时遇到新问题。我可以闪烁 LED 我可以用传输的数据驱动继电器,但我无法产生 PWM 信号。
maps(120, 1, 1, 250, RxData[4]);
ADC_Left = Yx; __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,ADC_Left);
我使用了 __HAL_TIM_SET_COMPARE 功能,但它不起作用。我可以在调试站点上观察到 ADC_Left 的值,但它不起作用。
我正在尝试实现2个stm32之间的UART通信。我知道有几个相关的话题,但我的问题集中在另一个话题上。
我在 stm32 上读取 2 个 adc 值,它只传输这些值,另一个只接收这 2 个 adc 值。为此
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // Interrupt Enable
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
char TxData1[10];
..............
TxData1[0] = 0xEA;
TxData1[1] = wData.Byte_1;
TxData1[2] = wData.Byte_2;
TxData1[3] = wData.Byte_3;
TxData1[4] = wData.Right_Adc_Val;
TxData1[5] = wData.Left_Adc_Val;
TxData1[6] = wData.Byte_6;
for(uint8_t i = 1 ; i < 7; i++)
{
wData.Checksum = wData.Checksum + TxData1[i];
}
wData.Checksum_H = (wData.Checksum >> 8)&0xFF;
wData.Checksum_L = (wData.Checksum)&0xFF;
TxData1[7] = wData.Checksum_H;
TxData1[8] = wData.Checksum_L;
TxData1[9] = 0xAE;
HAL_UART_Transmit_IT(&huart1,(uint8_t*) &TxData1,10);
............
这个块发送了它们,我可以在调试屏幕上观察它们并使用 TTL 模块的 Tx Rx 引脚。
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // Interrupt Enable
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
char RxData[10];
while(1){
HAL_UART_Receive_IT(&huart1,(uint8_t*) &RxData,10);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Receive_IT(&huart1,(uint8_t*) &RxData,10);
}
到这里没有问题,但是当我得到 RxData 0.index 时,它给出了 EA 。当然应该给EA。当 adc 数据改变时,所有排名都在改变。 RxData[0] 给出无意义的数据。 adc 值正在跳过所有 RxData 数组。
数据位置必须始终位于同一索引中。我怎样才能稳定地获得这些数据。
RxData[0]=EA
.
.
RxData[4]= 应该给出 adc 值。很快。
..
编辑:我尝试了UART的其他模式,使用了DMA(循环模式)和直接模式。我什至无法通过 DMA 接收 1 个字节。
在您的示例代码中,您有一个额外的 &
需要从传输和接收 HAL 方法调用中删除。示例:
HAL_UART_Transmit_IT(&huart1,(uint8_t*) &TxData1,10);
HAL_UART_Transmit_IT(&huart1,(uint8_t*) TxData1,10);
为避免将来出现此类错误,建议不要使用强制转换并尝试以下操作:
uint8_t TxData1[10];
...
HAL_UART_Transmit_IT(&huart1, TxData1, sizeof(TxData1);
编辑:我解决了 UART 通信问题,但我在接收传输数据后获取 pwm 信号时遇到新问题。我可以闪烁 LED 我可以用传输的数据驱动继电器,但我无法产生 PWM 信号。
maps(120, 1, 1, 250, RxData[4]);
ADC_Left = Yx; __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,ADC_Left);
我使用了 __HAL_TIM_SET_COMPARE 功能,但它不起作用。我可以在调试站点上观察到 ADC_Left 的值,但它不起作用。
我正在尝试实现2个stm32之间的UART通信。我知道有几个相关的话题,但我的问题集中在另一个话题上。
我在 stm32 上读取 2 个 adc 值,它只传输这些值,另一个只接收这 2 个 adc 值。为此
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // Interrupt Enable
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
char TxData1[10];
..............
TxData1[0] = 0xEA;
TxData1[1] = wData.Byte_1;
TxData1[2] = wData.Byte_2;
TxData1[3] = wData.Byte_3;
TxData1[4] = wData.Right_Adc_Val;
TxData1[5] = wData.Left_Adc_Val;
TxData1[6] = wData.Byte_6;
for(uint8_t i = 1 ; i < 7; i++)
{
wData.Checksum = wData.Checksum + TxData1[i];
}
wData.Checksum_H = (wData.Checksum >> 8)&0xFF;
wData.Checksum_L = (wData.Checksum)&0xFF;
TxData1[7] = wData.Checksum_H;
TxData1[8] = wData.Checksum_L;
TxData1[9] = 0xAE;
HAL_UART_Transmit_IT(&huart1,(uint8_t*) &TxData1,10);
............
这个块发送了它们,我可以在调试屏幕上观察它们并使用 TTL 模块的 Tx Rx 引脚。
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // Interrupt Enable
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
char RxData[10];
while(1){
HAL_UART_Receive_IT(&huart1,(uint8_t*) &RxData,10);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Receive_IT(&huart1,(uint8_t*) &RxData,10);
}
到这里没有问题,但是当我得到 RxData 0.index 时,它给出了 EA 。当然应该给EA。当 adc 数据改变时,所有排名都在改变。 RxData[0] 给出无意义的数据。 adc 值正在跳过所有 RxData 数组。
数据位置必须始终位于同一索引中。我怎样才能稳定地获得这些数据。
RxData[0]=EA . . RxData[4]= 应该给出 adc 值。很快。 ..
编辑:我尝试了UART的其他模式,使用了DMA(循环模式)和直接模式。我什至无法通过 DMA 接收 1 个字节。
在您的示例代码中,您有一个额外的 &
需要从传输和接收 HAL 方法调用中删除。示例:
HAL_UART_Transmit_IT(&huart1,(uint8_t*) &TxData1,10);
HAL_UART_Transmit_IT(&huart1,(uint8_t*) TxData1,10);
为避免将来出现此类错误,建议不要使用强制转换并尝试以下操作:
uint8_t TxData1[10];
...
HAL_UART_Transmit_IT(&huart1, TxData1, sizeof(TxData1);