在线时间177 小时
UID2086045
ST金币1052
蝴蝶豆0
注册时间2014-4-15
该用户从未签到
金牌会员
- 最后登录
- 2021-3-6
|
STM32电机培训online,大佬带你玩电机
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_dma.h"
uint8_t HEX_CODE[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
uint8_t USART2_DMA_TX_Buf[1024];
uint8_t Flag_USART2_DMA_TX_Finished = 1;
uint8_t Flag_USART2_Send = 0;
/**
* Function Name : USART2_Config
* Description : None
* Input : None
* Output : None
* Return : None
*/
void USART2_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* config USART2 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* *********************USART2 GPIO config **********************/
/* Configure USART1 Tx (PA.02) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART2 Rx (PA.03) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART2 mode config 115200 8-N-1*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
/* Enable USART2 DMA TX request */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel7);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_DMA_TX_Buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel7, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable USART2 DMA TX Finish Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
/**
* Function Name : USART2_Data_Load
* Description : None
* Input : None
* Output : None
* Return : None
*/
void USART2_Data_Load(uint16_t temp1, uint16_t temp2, uint8_t temp3){
USART2_DMA_TX_Buf[0] = HEX_CODE[temp1 >> 4];
USART2_DMA_TX_Buf[1] = HEX_CODE[temp1 & 0x0F];
USART2_DMA_TX_Buf[2] = HEX_CODE[temp2 >> 4];
USART2_DMA_TX_Buf[3] = HEX_CODE[temp2 & 0x0F];
USART2_DMA_TX_Buf[4] = 0x20;
USART2_DMA_TX_Buf[5] = HEX_CODE[temp3];
USART2_DMA_TX_Buf[6] = 0x0D;
USART2_DMA_TX_Buf[7] = 0x0A;
Flag_USART2_Send = 1;
}
/**
* Function Name : USART2_Data_Send
* Description : None
* Input : None
* Output : None
* Return : None
*/
void USART2_Data_Send(uint16_t len) {
if(Flag_USART2_Send){
if(Flag_USART2_DMA_TX_Finished == 1){
Flag_USART2_DMA_TX_Finished = 0;
DMA1_Channel7->CMAR = (uint32_t)&USART2_DMA_TX_Buf[0];
DMA1_Channel7->CNDTR = 8; // len
DMA_Cmd(DMA1_Channel7, ENABLE);
Flag_USART2_Send = 0;
}
}
}
/**
* Function Name : USART2_IRQHandler
* Description : This function handles USART2 global interrupt request.
* Input : None
* Output : None
* Return : None
*/
void USART2_IRQHandler(void) {
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) {
(void)USART_ReceiveData(USART2);
}
if (USART_GetITStatus(USART2, USART_IT_TC) != RESET) {
/* Disable the USART2 Transmit Complete interrupt */
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
Flag_USART2_DMA_TX_Finished = 1;
}
/* If overrun condition occurs, clear the ORE flag a.nd recover communication */
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) != RESET) {
(void)USART_ReceiveData(USART2);
}
}
/**
* Function Name : DMA1_Channel7_IRQHandler
* Description : This function handles DMA1 Channel 7 interrupt request.
* Input : None
* Output : None
* Return : None
*/
void DMA1_Channel7_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC7)) {
/* USART2 DMA 传输完成 */
DMA_ClearITPendingBit(DMA1_IT_TC7);
DMA_Cmd(DMA1_Channel7, DISABLE);
/* Enable USART2 Transmit complete interrupt */
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
}
}
|
|