微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 求助各位高手帮忙看看我这个程序,帮忙找出问题

求助各位高手帮忙看看我这个程序,帮忙找出问题

时间:10-02 整理:3721RD 点击:
这是个串口发射程序,仿真没有问题,开发板也没有问题,其他的程序能够使用,就是这个程序在电脑上看不到数据
#include<stm32f10x_gpio.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_usart.h>
int main()
{
        float div;
        u16 M,F,BRR;
        u32 BOUND;
        u8 data='A';
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能APB2外设的GPIOA的时钟       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIOA->CRH = 0X000004B0;
        USART1->CR1 |= (1<<13);
        USART1->CR1 &= ~(1<<12);
        USART1->CR2 &= ~(3<<12);
        USART1->CR1 |= (1<<3);
        BOUND = 9600;
        div = (float)(36*1000*1000)/(BOUND*16);
        M = div;
        F = (div-M)*16;
        BRR = M<<4+F;
        USART1->BRR = BRR;
//        RCC->APB1RSTR|=1<<18;   //复位串口3
//    RCC->APB1RSTR&=~(1<<18);//停止复位
        for(F=0;F<20;F++)
        {
                USART1->DR = data;
                data++;
                while((USART1->SR & (1<<6))==0);
        }
}


看一下串口使用的串口号对不对
另外 主函数应该添加while(1); 否则程序会跑飞。

串口配置好像没有错,错误应该在这段里面:
for(F=0;F<20;F++)
        {
                USART1->DR = data;
                data++;
                while((USART1->SR & (1<<6))==0);
        }
}
先弄个死循环一直发送,再看看寄存器 ((USART1->SR & (1<<6))==0)是不是应该是((USART1->SR & (1<<7))==0)
E:\张晓瑞\stm32

看看吧
发送时的


应该是你的波特率计算有问题,如果你的时钟频率确实是36×1000×1000,这个计算应该没问题,误差不大,不影响UART的同步;
请确定你的时钟确实的数值,如果你是比较规范的使用系统头文件构成项目,请使用RTE_PCLK2替换36×1000×1000;或者在PC端改变接收串口波特率试一下?
你的程序中存在下面描述的问题:
       BOUND = 9600;
         div = (float)(36*1000*1000)/(BOUND*16);
         M = div;
         F = (div-M)*16;
         BRR = M<<4+F;
这个计算里面有问题,先M = div,然后 F = (div-M)*16;我直接怀疑编译器会将这两句译成 F=0;

先看波特率设置是否正确,接着尝试发单独一个数据来排查是哪出错了。很有可能是波特率初始化的错误

谢谢各位的回答 问题已经解决了,问题是在发送第一个字符的时候没有检查TC是否为空

TC复位时就是有效(1:发送完成)的啊!?
你只处理这个问题就行了?

上一篇:ARM和单片机AVR的区别!
下一篇:arm 汇编

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top