完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面写的是通过STM32串口发送舵机命令给舵机驱动器,为什么不能实现呢?作为新人,希望大家多多指教,非常感谢!!! #include"stdio.h" #include"stm32f10x_lib.h" #include"stdint.h" void RCC_Configuration(void); void GPIO_Configuration(void); void USART_Config(USART_TypeDef* USARTx); void USART_SendChar(USART_TypeDef* USARTx,uint8_t data); int main(void) { RCC_Configuration(); //系统时钟设置 GPIO_Configuration(); //端口初始化 USART_Config(USART1); //串口1初始化 int i=0; char buf[]="#0P1600S750 for(i=0;i<15;i++)//发送字符串 { USART_SendChar(USART1,buf); } } void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判断HSE起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus == SUCCESS) { /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择SYSCLK时钟源为PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源 */ while(RCC_GetSYSCLKSource() != 0x08); } /* 开启USART1和GPIOA时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); //A端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口 } //USART初始化,包括波特率、数据位、停止位等~ void USART_Config(USART_TypeDef* USARTx) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; //速率9600bps USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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; //收发模式 /* Configure USART1 */ USART_Init(USARTx, &USART_InitStructure); //配置串口参数函数 /* Enable the USART1 */ USART_Cmd(USART1, ENABLE); } void USART_SendChar(USART_TypeDef* USARTx,uint8_t data) { USART_SendData(USARTx,data); while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET); } |
|
相关推荐
10个回答
|
|
请教大神!!!
|
|
|
|
char buf[]="#0P1600S750
for(i=0;i<15;i++)//发送字符串 { USART_SendChar(USART1,buf);=>USART_SendChar(USART1,buf[i]); } |
|
|
|
这个手误,并不是主要的错误啊,我在想是不是USART_SendChar()这个函数,因为它发送的是两个字节的数据,而buf[]里面的数据都是一个字节的 |
|
|
|
兄弟,你有没有注意到一个问题?你的USART的TX管脚没配置输出速率,如果不配置速率的话,GPIOx_CLR寄存器的21 20位默认为00,即输入模式(复位默认模式),当然也就不能发送数据了
|
|
|
|
还有,你这写这么多代码配置时钟是配置的72M吧?好像MCU复位时默认的就是72M,不用再那么麻烦配置了,如果要配置成其他频率可以重新配置,直接打开要用的外设时钟就可以了
|
|
|
|
进入调试模式,单步执行,看哪里和理想中的情况不一样
|
|
|
|
meimengxing2014 发表于 2016-4-23 19:33 代码没看,不过系统时钟肯定不用配置了,在启动代码中已经配置过了,宏定义的地方选择72MHZ可以了。3.5的库是这样的,嘿嘿。其余外设时钟自己再有选择的开~ |
|
|
|
HARRY007 发表于 2016-4-26 11:36 恩,是的,要改为其他频率直接改红定义就好 |
|
|
|
我也有变个问题!
|
|
|
|
一步一步执行,看哪里不合适
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
OV7670摄像头使用串口发送数据到另一个板子上的lcd,出现花屏
657 浏览 1 评论
502 浏览 0 评论
413 浏览 0 评论
STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植
578 浏览 0 评论
STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
542 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-15 05:16 , Processed in 0.827987 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号