Мигающий светодиод в программировании на Bare-Metal C: STM32L476RG Nucleo Board - PullRequest
0 голосов
/ 09 октября 2019

Я попытался реализовать классический пример мерцания на плате STM32L476RG Nucleo.

В соответствии с таблицей данных STM32L4x: LD2 подключен к порту 5 GPIOA (PA5). PA5 использует шину AHB2.

Примечание: Я использовал Keil uVision 5;Я создал новый проект uVision с целью STM32L476RGTx. В диалоговом окне «Управление средой выполнения» я выбрал:

  1. CMSIS >> Core (флаг)
  2. Устройство >> Запуск (флаг)

Здесь код:

#include "stm32l4xx.h"                  // Device header
//#include <stdint.h>

//#define MASK(x) ((uint32_t) (1<<(x))) // bitmasking 

void delayMs(int delay);

int main(void){
    // RCC->AHB2RSTR |=1; 
    // RCC->AHB2RSTR &=~1; 
    // RCC->AHB2ENR |= MASK(0); //bitwise OR. Enable GPIOA clock
     RCC->AHB2ENR |= 1;
     //GPIOA->MODER |= MASK(10);
    GPIOA->MODER |= 0x400; 

    while(1){


        //GPIOA->ODR |= MASK(4);
         GPIOA->ODR |= 0x20;
        delayMs(500);
        //GPIOA->ODR &= ~MASK(4);
        GPIOA->ODR &= ~0x20;
        delayMs(500);
    }
}

void delayMs(int delay){
int i;
    for(;delay>0; delay --){
        for (i=0; i<3195;i++);
    }
}

Выход Build возвращает:

Build started: Project: blinknew
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=520 RO-data=408 RW-data=0 ZI-data=1632  
".\Objects\blinknew.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:09

, и когда я его скачиваю, Keil uV 5 возвращает:

 Load "C:\\Users\\gmezz\\OneDrive\\Documenti\\Bare_Metal\\Blinknew\\Objects\\blinknew.axf" 
Erase Done.
Programming Done.
Verify OK.
Flash Load finished at 22:37:52

Светодиод должен мигать с периодом 1 с, но на самом деле ничего не происходит.

Честно говоря, я не понимаю, что происходит не так.

Кто-то может мне помочь?

GM

1 Ответ

0 голосов
/ 10 октября 2019

Я могу ошибаться, но согласно разделу 6.2.19 справочного руководства (RM0351), вам следует подождать 2 такта после включения периферийных часов, прежде чем получить доступ к их регистрам. Попробуйте ввести небольшую задержку после RCC-> AHB2ENR | = 1;линия. В вашем случае, я думаю, что регистр MODER не получает правильное значение.

Я также предлагаю проверить фактические значения регистров с помощью отладчика.

...