本帖最后由 xzrsh 于 2017-10-1 17:31 编辑
开发板:野火746核心板(STM32F746IGT6两个双排针引出IO + SDRAM + SPI Flash W25Q128)
开发环境: IAR EWARM V7.50 + JLinkV9 SWD模式
测试代码: 使用STM32Cube_FW_F7_V1.4.0里面的STM32F746ZG-Nucleo --- Examples --- GPIO --- GPIO_IOToggle --- EWARM工程
其中代码略微做了修改,IO口使用PH13作为输出。代码如下:
GPIO_InitTypeDef GPIO_InitStruct;
int main(void)
{
/* 1. Enable the CPU Cache */
CPU_CACHE_Enable();
/* 2. STM32F7xx HAL library initialization: */
HAL_Init();
/* 3. Configure the system clock to 216 MHz */
SystemClock_Config();
/* 4. Enable GPIO Clock (to be able to program the configuration registers) */
//__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
/* 5. Configure IO in output push-pull mode to drive external LEDs */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pin = GPIO_PIN_13;//GPIO_PIN_0;
//HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
/* 6. Toggle IO in an infinite loop */
while (1)
{
//HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_13);
/* 中间有很多这样的翻转语句 */
HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_13); /* Insert delay 100 ms */
//HAL_Delay(100);
}
}
main函数中所使用的系统初始化配置函数就不贴出来了,各个样例工程中都有,MDK使用的也是一样的函数。
下载到MCU中后,运行结果是翻转频率只有15MHz不到,如图所示:
(大概频率略有差异,但波形基本如此)
修改翻转代码,不使用库函数HAL_GPIO_TogglePin(),而使用寄存器直接赋值:
/* 6. Toggle IO in an infinite loop */
while (1)
{
GPIOH->BSRR = GPIO_PIN_13; GPIOH->BSRR = (GPIO_PIN_13 << 16);
/* 中间有很多这样的翻转语句 */
GPIOH->BSRR = GPIO_PIN_13;
GPIOH->BSRR = (GPIO_PIN_13 << 16);
/* Insert delay 100 ms */
//HAL_Delay(100);
}
这个输出就很怪异了,大部分是中间电平(1.6V左右),偶尔蹦出个高电平或低电平的脉冲出来,如下两图:
对其中的中间电平部分(就是比较密集的看起来像杂波)拉宽后,如下图:
可以看出,其波动频率大约为50MHz。
对翻转代码的寄存器赋值后,都增加一条读寄存器指令:
/* 6. Toggle IO in an infinite loop */
while (1)
{
GPIOH->BSRR = GPIO_PIN_13; (void)GPIOH->IDR;
GPIOH->BSRR = (GPIO_PIN_13 << 16); (void)GPIOH->IDR;
/* 中间有很多这样的翻转语句 */
GPIOH->BSRR = GPIO_PIN_13; (void)GPIOH->IDR;
GPIOH->BSRR = (GPIO_PIN_13 << 16); (void)GPIOH->IDR;
/* Insert delay 100 ms */
//HAL_Delay(100);
}
上述代码就可以得到正常翻转的波形,但频率仍和使用库函数HAL_GPIO_TogglePin()时差不多,也不到15MHz。
根据ST的数据手册和参考手册以及宣传资料可知,STM32F7的GPIO挂在AHB下,可以做到每2个HCLK改变一次IO的状态,216/2 = 108MHz,方波频率 = 54MHz。
从实际情况来看,好像指令也执行了,但相应的上下MOS管并没有适时彻底开通从而输出高/低电平,只是偶尔才会彻底打开一下驱动MOS管,大部分情况都是处于没彻底导通的情形。
有谁知道这是怎么回事儿吗?
|