搜索
bottom↓
回复: 19

关于STM32串口

[复制链接]

出0入0汤圆

发表于 2014-7-15 21:00:21 | 显示全部楼层 |阅读模式
#include"stdio.h"
#include"stm32f10x.h"
void uart_init(uint32_t pclk2,uint32_t bound);
void USART1_IRQHandler(void);
int main(void)
{
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPBEN;
        GPIOB->CRH|=(uint32_t)(GPIO_CRH_CNF10_0|GPIO_CRH_MODE10);
       
        uart_init(72,9600);

        while(1)
        {
                       
        }
}

void uart_init(uint32_t pclk2,uint32_t bound)
{
        float temp;
        uint16_t mantissa;
        uint16_t fraction;
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;
        fraction=(temp-mantissa)*16;
        mantissa<<=4;
        mantissa+=fraction;

        NVIC->ISER[1]|=NVIC_ISER_SETENA;
        NVIC->ISER[0]|=NVIC_ISER_SETENA;
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPAEN;      //´ò¿ªGPIOAʱÖÓ
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_USART1EN;    //´ò¿ª´®¿ÚʱÖÓ
        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF9_1|GPIO_CRH_MODE);   //TXÍÆÍ츴Óù¦ÄÜÊä³ö
        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF10_0);                //RX¸¡¿ÕÊäÈë
        RCC->APB2RSTR|=(uint32_t)(RCC_APB2RSTR_USART1RST);      //¸´Î»´®¿Ú1
        RCC->APB2RSTR&=~(uint32_t)(RCC_APB2RSTR_USART1RST);              //Í£Ö¹¸´Î»´®¿Ú1

        USART1->CR1|=(uint32_t)USART_CR1_UE;             //UE=1£¬¼¤»îUSART1
        USART1->CR1|=(uint32_t)USART_CR1_TE;             //TE=1£¬·¢ËÍʹÄÜ
        USART1->CR1|=(uint32_t)USART_CR1_RE;             //RE=1£¬½ÓÊÜʹÄÜ
        USART1->CR1|=(uint32_t)USART_CR1_RXNEIE;         //½ÓÊÕ»º³åÇø·Ç¿ÕÖжÏʹÄÜ
        USART1->BRR=mantissa;                    //ÉèÖò¨ÌØÂÊ
}
void USART1_IRQHandler(void)
{
        uint8_t temp;
        if(USART1->SR&USART_SR_RXNE)
        {
                temp=USART1->DR;
                USART1->DR=temp;
        }       
}

这是我写的STM32串口程序,想实现的功能是我往USART1发送一个字符,然后单片机再把这个字符发回给我。
但我这程序现在的状况就是:我给他发字符,而他却不进中断。熟悉STM32的大虾们帮我看看吧,谢谢!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-7-15 22:01:00 | 显示全部楼层
uint8_t temp;改成 volatile uint8_t temp;试一下,有可能编译器优化问题。还有,中断挂接了吗?没看到对应的操作啊

出0入0汤圆

发表于 2014-7-15 22:58:32 | 显示全部楼层
操作寄存器看得眼花

出0入0汤圆

 楼主| 发表于 2014-7-15 23:50:06 | 显示全部楼层
afeionline 发表于 2014-7-15 22:01
uint8_t temp;改成 volatile uint8_t temp;试一下,有可能编译器优化问题。还有,中断挂接了吗?没看到对应 ...

现在我通过串口助手给USART1发数据,单片机不进中断,我不知道这是怎么回事;
中断挂接是什么意思?
我刚开始学stm32,对他不太熟悉,麻烦了

出0入42汤圆

发表于 2014-7-15 23:54:06 | 显示全部楼层
  /* Enable the USART1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

出0入0汤圆

发表于 2014-7-16 09:26:38 | 显示全部楼层
你写这些程序的时候看数据手册了吗?
        NVIC->ISER[1]|=NVIC_ISER_SETENA;
        NVIC->ISER[0]|=NVIC_ISER_SETENA;
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPAEN;      //´ò¿ªGPIOAʱÖÓ
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_USART1EN;    //´ò¿ª´®¿ÚʱÖÓ

        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF9_1|GPIO_CRH_MODE);   //TXÍÆÍ츴Óù¦ÄÜÊä³ö
        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF10_0);                //RX¸¡¿ÕÊäÈë
        RCC->APB2RSTR|=(uint32_t)(RCC_APB2RSTR_USART1RST);      //¸´Î»´®¿Ú1
        RCC->APB2RSTR&=~(uint32_t)(RCC_APB2RSTR_USART1RST);              //Í£Ö¹¸´Î»´®¿Ú1

你前面打开的时候后面为什么又复位了?

别上来就玩寄存器了,先研究一下固件库吧,了解一下最起码的初始化流程

出0入0汤圆

 楼主| 发表于 2014-7-16 19:36:03 | 显示全部楼层
w282529350 发表于 2014-7-16 09:26
你写这些程序的时候看数据手册了吗?
        NVIC->ISER[1]|=NVIC_ISER_SETENA;
        NVIC->ISER[0]|=N ...

谢谢,我修改一下试试,成果的话告诉你;
用固件更难阿,那么多东西!

出0入0汤圆

发表于 2014-7-16 20:08:10 | 显示全部楼层
565715470 发表于 2014-7-16 19:36
谢谢,我修改一下试试,成果的话告诉你;
用固件更难阿,那么多东西!

固件基本都有现成的历程,简单改改就好了。

出0入0汤圆

发表于 2014-7-16 23:14:28 | 显示全部楼层
565715470 发表于 2014-7-16 19:36
谢谢,我修改一下试试,成果的话告诉你;
用固件更难阿,那么多东西!

刚开始学的话,照着别人的例程多练习一下,推荐一下 零死角玩转STM32。
通过库文件操作起来比较容易一些,自己直接操作寄存器麻烦,也容易出问题,只有先熟悉了库文件后面才能知道自己怎么优化。

出0入0汤圆

 楼主| 发表于 2014-7-16 23:35:33 | 显示全部楼层
w282529350 发表于 2014-7-16 09:26
你写这些程序的时候看数据手册了吗?
        NVIC->ISER[1]|=NVIC_ISER_SETENA;
        NVIC->ISER[0]|=N ...

修改后还是不行

出0入0汤圆

 楼主| 发表于 2014-7-16 23:37:06 | 显示全部楼层
afeionline 发表于 2014-7-16 23:14
刚开始学的话,照着别人的例程多练习一下,推荐一下 零死角玩转STM32。
通过库文件操作起来比较容易一些 ...

哥,你帮我把这程序的错误找找吧,找不到错误不甘心啊

出0入0汤圆

发表于 2014-7-17 20:37:21 | 显示全部楼层
565715470 发表于 2014-7-16 23:37
哥,你帮我把这程序的错误找找吧,找不到错误不甘心啊

说实话,看不懂你的寄存器操作

出0入0汤圆

发表于 2014-7-18 08:42:09 | 显示全部楼层
你找到固件库的话,里面就有现成的例子,根本不需要你自己写,你慢慢分析固件库里面的寄存器操作顺序就行了

另外,你这寄存器的配置完全基于你自己的理解,你用人家的芯片,首先就要遵循人家的规定吧,而不是靠你自己的猜测

出0入0汤圆

 楼主| 发表于 2014-7-20 23:58:26 | 显示全部楼层
#include"stdio.h"
#include"stm32f10x.h"
void uart_init(uint32_t pclk2,uint32_t bound);
void USART1_IRQHandler(void);
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group);
void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group);


int main(void)
{
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPBEN;
        GPIOB->CRH|=(uint32_t)(GPIO_CRH_CNF10_0|GPIO_CRH_MODE10);
        uart_init(72,9600);
        while(1)
        {
        }
}

void uart_init(uint32_t pclk2,uint32_t bound)
{
        float temp;
        uint16_t mantissa;
        uint16_t fraction;
        temp=(float)(pclk2*1000000)/(bound*16);
        mantissa=temp;
        fraction=(temp-mantissa)*16;
        mantissa<<=4;
        mantissa+=fraction;

       
        //UART1³õʼ»¯
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_IOPAEN;      //´ò¿ªGPIOAʱÖÓ
        RCC->APB2ENR|=(uint32_t)RCC_APB2ENR_USART1EN;    //´ò¿ª´®¿ÚʱÖÓ
        RCC->APB2RSTR|=(uint32_t)(RCC_APB2RSTR_USART1RST);      //¸´Î»´®¿Ú1
        RCC->APB2RSTR&=~(uint32_t)(RCC_APB2RSTR_USART1RST);              //Í£Ö¹¸´Î»´®¿Ú1
        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF9_1|GPIO_CRH_MODE9);   //TXÍÆÍ츴Óù¦ÄÜÊä³ö
        GPIOA->CRH&=~(uint32_t)GPIO_CRH_CNF9_0;
        GPIOA->CRH|=(uint32_t)(GPIO_CRH_CNF10_0);                //RX¸¡¿ÕÊäÈë

        USART1->CR1|=(uint32_t)USART_CR1_UE;             //UE=1£¬¼¤»îUSART1
        USART1->BRR=mantissa;                            //ÉèÖò¨ÌØÂÊ
        USART1->CR1|=(uint32_t)USART_CR1_TE;             //TE=1£¬·¢ËÍʹÄÜ
        USART1->CR1|=(uint32_t)USART_CR1_RE;             //RE=1£¬½ÓÊÜʹÄÜ
        MY_NVIC_Init(1,1,37,2);
        USART1->CR1|=(uint32_t)USART_CR1_RXNEIE;         //½ÓÊÕ»º³åÇø·Ç¿ÕÖжÏʹÄÜ
}

void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group)   
{
        u32 temp;   
        MY_NVIC_PriorityGroupConfig(NVIC_Group);
        temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
        temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
        temp&=0xf;
        if(NVIC_Channel<32)
                NVIC->ISER[0]|=1<<NVIC_Channel;
        else
                NVIC->ISER[1]|=1<<(NVIC_Channel-32);   
        NVIC->IP[NVIC_Channel]|=temp<<4;
}
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)   
{
        u32 temp,temp1;
        temp1=(~NVIC_Group)&0x07;
        temp1<<=8;
        temp=SCB->AIRCR;  
        temp&=0X0000F8FF;
        temp|=0X05FA0000;
        temp|=temp1;
        SCB->AIRCR=temp;                  
}

void USART1_IRQHandler(void)
{
        uint8_t temp;
        GPIOB->ODR=~GPIOB->ODR;                
        if(USART1->SR&USART_SR_RXNE)
        {
                temp=USART1->DR;
                USART1->DR=temp;
                while(!((USART1->SR)&USART_SR_TC));
        }       
}

问题解决了,上面加粗的部分是新加的代码(就是把正点原子的代码做了很小的改动)。然后就实现了我要的功能。

出0入0汤圆

 楼主| 发表于 2014-7-20 23:59:33 | 显示全部楼层
w282529350 发表于 2014-7-18 08:42
你找到固件库的话,里面就有现成的例子,根本不需要你自己写,你慢慢分析固件库里面的寄存器操作顺序就行了 ...

问题已解决,我把新代码贴出来了。

出0入0汤圆

 楼主| 发表于 2014-7-20 23:59:59 | 显示全部楼层
afeionline 发表于 2014-7-17 20:37
说实话,看不懂你的寄存器操作

问题已解决,我把新代码贴出来了。

出0入0汤圆

发表于 2014-7-21 17:24:05 | 显示全部楼层
中断优先级没有设定,之前遇到过

出0入0汤圆

 楼主| 发表于 2014-7-21 18:56:26 | 显示全部楼层
xld826 发表于 2014-7-21 17:24
中断优先级没有设定,之前遇到过

没有设定中断优先级,但优先级寄存器里不是有默认值0吗,为什么默认优先级0时不能进中断?

出0入0汤圆

发表于 2014-7-22 12:48:08 | 显示全部楼层
565715470 发表于 2014-7-21 18:56
没有设定中断优先级,但优先级寄存器里不是有默认值0吗,为什么默认优先级0时不能进中断? ...

我也这么想的,但是没有彻底研究。反正结果就是设置了中断优先级就OK了

出0入0汤圆

发表于 2014-7-27 21:46:00 | 显示全部楼层
mark~~~~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 18:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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