中空磁环编码器
STM32 CubeMX配置
选用串口4
时钟配置
GPIO、DMA配置
开启全局中断
keil 程序
usart.c文件
/* USER CODE BEGIN 0 */
volatile uint8_t rx_len = 0;
volatile uint8_t recv_end_flag = 0;
uint8_t rx_buffer[100]={0};
/* USER CODE END 0 */
main.c文件
串口4配置函数,中断回调函数
/* USER CODE BEGIN PD */
#define UART4_RXBUFF_SIZE 16
uint8_t UART4_RxBuff[UART4_RXBUFF_SIZE];
uint8_t uart4_recv_flag = 0;
uint8_t cnt;
uint16_t DecValue;
void Uart4Config(void)
{
LL_DMA_SetPeriphAddress(DMA2, LL_DMA_CHANNEL_3, (uint32_t)(&UART4->DR));
LL_DMA_SetMemoryAddress(DMA2, LL_DMA_CHANNEL_3, (uint32_t)UART4_RxBuff);
LL_DMA_SetDataLength(DMA2, LL_DMA_CHANNEL_3, UART4_RXBUFF_SIZE);
LL_DMA_EnableChannel(DMA2, LL_DMA_CHANNEL_3);
LL_USART_EnableDirectionRx(UART4);
LL_USART_EnableDMAReq_RX(UART4);
LL_USART_ClearFlag_TC(UART4);
LL_USART_EnableIT_IDLE(UART4);
}
void UART4_IRQHandlerCallback(void)
{
if(LL_USART_IsActiveFlag_IDLE(UART4))
{
LL_DMA_DisableChannel(DMA2, LL_DMA_CHANNEL_3);
uint8_t cnt = UART4_RXBUFF_SIZE - LL_DMA_GetDataLength(DMA2, LL_DMA_CHANNEL_3);
LL_DMA_SetDataLength(DMA2, LL_DMA_CHANNEL_3, UART4_RXBUFF_SIZE);
LL_DMA_EnableChannel(DMA2, LL_DMA_CHANNEL_3);
LL_USART_ClearFlag_IDLE(UART4);
uart4_recv_flag = cnt;
}
//编码器数据转换为0--16383
DecValue = (UART4_RxBuff[3] << 8) | UART4_RxBuff[2];//编码器数据转换为0--16383
}
/* USER CODE END PD */
/* USER CODE BEGIN 2 */
Uart4Config();
/* USER CODE END 2 */
while (1)
{
LL_USART_TransmitData8(UART4, 0x02);
LL_mDelay(10);
}
stm32f1xx_it.c文件
将UART4_IRQHandlerCallback()放入UART4_IRQHandler中断处理函数
void UART4_IRQHandler(void)
{
/* USER CODE BEGIN UART4_IRQn 0 */、
UART4_IRQHandlerCallback();
/* USER CODE END UART4_IRQn 0 */
/* USER CODE BEGIN UART4_IRQn 1 */
/* USER CODE END UART4_IRQn 1 */
}
串口助手发送0x02,即可收到返回数据