在调试电机驱动程序的时分,是不能随意运用中止来进行一些寄存器或数据的检查的,否则你在运转的时分忽然来一下,假如占空比大的话那或许直接就把MOS管给烧了,所以咱们许多情况下只能运用USART(串口)来进行程序的调试和数据的监控了。
关于STM32来说,因为许多内容都是有库来完成的,那就省了许多时刻,直接看个比如就能够写了,大致有4步过程:
1 1、RCC一向初始化,对端口和USARTX使能时钟2 2、初始化端口功用,RX设置为输入悬空,TX设置为复用功用的推挽输出,留意GPIO_SPEED要设置下,我没设置弄了半响都没输出3 3、设置USARTX寄存器,波特率、数据位、校验位、中止位等4 4、看需求是否开中止,我这儿没开
设置完后其实是能够发简略的数据了,不过假如要完成一些杂乱的输出就需求自己去写相应的函数,还不一定能都完成,那该怎样才干跟好完成串口的数据输出呢?
这儿就能够用到Printf函数,之前一向看个能够重定向这个函数来呈现输出,便是曾经片子资源少,就没想过用这个函数了,现在就有时机试试了。查了下,发现其实仍是很简略的,便是重定向一个函数就好了。
1 #include//规范的库函数2 3 //重写这个函数就能够了4 #ifdef _PRINTF_5 int fputc(int ch, FILE *f)6 {7 USART_SendData(USART3, (u8) ch);8 9 while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))10 {11 }12 13 return ch;14 }15 #endif
还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面运用printf输出数据就OK了,关于调试来说仍是适当好用的。
初始化设置:
void Uart_RccInit(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);}void Uart_GpioInit(void){GPIO_InitTypeDef GPIO_InitStructure;//PB10作为US1的TX端,翻开复用,担任发送数据GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置或许导致无输出GPIO_Init(GPIOB, &GPIO_InitStructure);//PB11作为US1的RX端,担任接纳数据GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);}void Uart_UartInit(void){USART_InitTypeDef USART_InitStructure;USART_StructInit(&USART_InitStructure);USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART3, &USART_InitStructure);// USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE);}