OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2938|回复: 3

新人请教一下串口一些问题。

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-16
在线时间
2 小时
发表于 2017-11-16 12:15:49 | 显示全部楼层 |阅读模式
我用原子实验例程 现在需要跟FPGA做一个串口通信。代码是原子的代码 ,初始化在下面
//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
void uart_init(u32 pclk2,u32 bound)
{
        float temp;
        u16 mantissa;
        u16 fraction;
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
    mantissa<<=4;
        mantissa+=fraction;
        RCC->AHB1ENR|=1<<0;           //使能PORTA口时钟
        RCC->APB2ENR|=1<<4;          //使能串口1时钟
        GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
        GPIO_AF_Set(GPIOA,9,7);        //PA9,AF7
        GPIO_AF_Set(GPIOA,10,7);//PA10,AF7
        //波特率设置
        USART1->BRR=mantissa;         //波特率设置         
        USART1->CR1&=~(1<<15);         //设置OVER8=0
        USART1->CR1|=1<<3;          //串口发送使能
#if EN_USART1_RX                          //如果使能了接收
        //使能接收中断
        USART1->CR1|=1<<2;          //串口接收使能
//        USART1->CR1|=1<<5;            //接收缓冲区非空中断使能                   
        MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
        USART1->CR1|=1<<13;          //串口使能
}


初始化没有任何改动。我看手册上说发送使能打开之后,只要状态寄存器里面的TXE位清空,只需往数据寄存器USART1->DR里面写数据就可以发送。所以我做了下面一个函数 放在了MAIN函数的WHILE循环里。、、

void USART_SEND_BYTE(u8 ch)
{
        while((USART1->SR&0X40)==0);
        USART1->DR = ch;
        return;
}


主函数

int main(void)
{

        Stm32_Clock_Init(336,25,2,7);//设置时钟,168Mhz
        delay_init(168);                //延时初始化
        uart_init(84,115200);        //串口初始化为115200
        while(1)
        {
                USART_SEND_BYTE(0x55);
        }
}


这个只是想尝试一下串口数据有没有发出,但是现在FPGA并没接收到任何数据(FPGA程序确认并测试无误),示波器测对应管脚PA9没任何电平变化。
所以想哪个大神能说一下我哪里没想明白或者想错了。我用的片子是STM32F407VET6。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-16
在线时间
2 小时
 楼主| 发表于 2017-11-16 12:16:12 | 显示全部楼层
在线等朋友们回复。谢谢大家。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-16
在线时间
2 小时
 楼主| 发表于 2017-11-16 14:47:45 | 显示全部楼层
void USART_SEND_BYTE(u8 ch)
{
        USART3->CR1 &= ~(1<<5);
        while((USART1->SR&0X40)==0);
        USART1->DR = ch;
        USART1->CR1|=1<<5;
        return;
}

想问一下发送前是不是需要除能接受中断?有没有大神能给稍微看一下代码。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-16
在线时间
2 小时
 楼主| 发表于 2017-11-16 15:54:30 | 显示全部楼层
没人帮个忙吗。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 04:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表