打印

STM32的HCLK1对IO口的读写有影响?

[复制链接]
1621|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
djtloveic|  楼主 | 2013-11-13 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想用STM32的IO来采集数据,就试了下IO口的速度,发现HCKL1的时钟对IO口的读写有影响,
看STM32的时钟,HCLK1是给APB1的,而GPIO是在APB2下的,HCLK1的配置怎么会影响到IO口的读写呢?知道的朋友能不能给解释一下,谢谢
沙发
香水城主| | 2013-11-13 11:54 | 只看该作者
你能肯定你的程序对吗?

使用特权

评论回复
板凳
djtloveic|  楼主 | 2013-11-13 12:18 | 只看该作者
谢谢香水城主的回复
程序是用库函数做的,时钟配置应该是对的,外部6M,PLL倍到54M,配置如下:
void RCC_Configuration(void)  
{  
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);        //打开HSE
        while(RCC_WaitForHSEStartUp() != SUCCESS);//待待HSE稳定
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                        //54M
        RCC_PCLK2Config(RCC_SYSCLK_Div1);                        //54M
        RCC_PCLK1Config(RCC_SYSCLK_Div2);                        //27M
        FLASH_SetLatency(FLASH_Latency_2);   
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);        //6M/1*9
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        while(RCC_GetSYSCLKSource() != 0x08);
}  
IO口测试是翻转IO电平,在示波器上看波形。
测试时发现PCLK1 2分频和1分频IO的翻转频率会减少一半,(1分频时超过36M,APB1的外设会有问题),不知道怎么回事。
当然,配HCLK2的时钟,IO口的翻转也会变化,但不知道为什么PCLK1对其也有影响

使用特权

评论回复
地板
djtloveic|  楼主 | 2013-11-13 14:57 | 只看该作者
重新仔细测试了一下,发现上面表述的有误。实际是改变HCLK2的时钟没影响,反而是改HCLK1的时钟对IO口读写速度有影响,越来越糊涂了。
IO速度测试程序:
void ReadData(void)
{
        u32* pp1;
        u32* pp2;//
        pp1 = (u32*)(GPIOB_BASE+0x0C);        //GPIOB-ODR
        pp2 = (u32*)(GPIOA_BASE+0x08);        //GPIOA-IDR
        *pp1 = 0x00A5;
        *pp1 = 0x005A;
        *pp1 = 0x00A5;
        *pp1 = 0x005A;
        Rbuf[0] = *pp2;
        Rbuf[1] = *pp2;
        Rbuf[2] = *pp2;
        Rbuf[3] = *pp2;
        *pp1 = 0x00A5;
        *pp1 = 0x005A;
        *pp1 = 0x00A5;
        *pp1 = 0x005A;
}
朋友们帮看下,是RCC时钟配置有问题还是别的什么原因?谢谢了

使用特权

评论回复
5
djtloveic|  楼主 | 2013-11-13 15:54 | 只看该作者
香水城主 发表于 2013-11-13 11:54
你能肯定你的程序对吗?

香水城主大侠,我把程序贴出来了,能不能帮我看看是哪的错误?谢谢了

使用特权

评论回复
6
香水城主| | 2013-11-13 16:42 | 只看该作者
        *pp1 = 0x00A5;
         *pp1 = 0x005A;
         *pp1 = 0x00A5;
         *pp1 = 0x005A;
         Rbuf[0] = *pp2;
         Rbuf[1] = *pp2;
         Rbuf[2] = *pp2;
         Rbuf[3] = *pp2;
         *pp1 = 0x00A5;
         *pp1 = 0x005A;
         *pp1 = 0x00A5;
         *pp1 = 0x005A;

你这样操作恐怕有问题,芯片中的外设响应赶不上CPU核心的速度。

你先在每行之间加点延迟,把外设访问速度降下来试试看。

使用特权

评论回复
7
djtloveic|  楼主 | 2013-11-13 17:14 | 只看该作者
香水城主 发表于 2013-11-13 16:42
*pp1 = 0x00A5;
         *pp1 = 0x005A;
         *pp1 = 0x00A5;

好的,我再测试一下,谢谢

使用特权

评论回复
8
djtloveic|  楼主 | 2013-11-13 18:10 | 只看该作者
每个操作间加了几个NOP指令,结果还是那样,IO速度受HCLK1时钟影响,搞不明白哪出问题了

使用特权

评论回复
9
djtloveic|  楼主 | 2014-1-17 16:02 | 只看该作者
找到问题出在哪了。
今天在测试ADC时,发现ADC的速度和计算出来的不一致,仔细看了上,才发现我程序中PCLK1 PCLK2的时钟配置一直都是错的
RCC_PCLK2Config(RCC_SYSCLK_Div1);               //54M
RCC_PCLK1Config(RCC_SYSCLK_Div2);               //27M
要改为
RCC_PCLK2Config(RCC_HCLK_Div1);                        //54M
RCC_PCLK1Config(RCC_HCLK_Div2);                        //27M
RCC_HCLK_Div1和RCC_SYSCLK_Div1差的可不是一点点。。。
写出来,希望和我一样的新手不要犯同样的错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

113

帖子

0

粉丝