找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6765|回復(fù): 9
收起左側(cè)

STM32 LED燈閃爍程序無錯但沒有閃爍效果

[復(fù)制鏈接]
ID:371529 發(fā)表于 2019-7-15 19:21 | 顯示全部樓層 |閱讀模式
下面是我寫的程序

#include "stm32f10x.h"

typedef unsigned int u16;

void delay(u16 i)
{
        while(i--);       
}

int main (void)//亮藍(lán)光
{
        #if 0   //條件編譯屏蔽此部分代碼
        //打開GPIOB端口的時鐘
  *(unsigned int*)0x40021018 |=((1)<<3);
       
        //配置IO口為輸出
  *(unsigned int*)0x40010C00 |=((1)<<(4*1)); //置1操作,10進(jìn)制的1
       
        //控制ODR寄存器 PB1
        *(unsigned int*)0x40010C0C &=~(1<<1);//清零操作

       
        #else
       
        //打開GPIOB端口的時鐘
        RCC_APB2ENR  |=((1)<<3);
       
        //配置IO口為輸出
        GPIO_CRL &=~((0x0f)<<(4*1)); // 將原狀態(tài)全部清零
        GPIO_CRL |=((1)<<(4*1));
       
        //控制ODR寄存器 PB1
        while(1)
        {
        GPIO_ODR  &=~(1<<1); //亮
          delay(500000);
        GPIO_ODR  &=~(0<<1);//滅
                 delay(500000);
        }
       
        #endif
}




void SystemInit(void)//start_stm32f10x_hd.s中啟動匯編時調(diào)用了SystemInit
{

}


不知道哪里有問題,編譯無錯誤無警告,但燒入單片機中卻仍只亮燈不閃爍。求解答。
回復(fù)

使用道具 舉報

ID:388197 發(fā)表于 2019-7-16 00:47 | 顯示全部樓層
建議還是用庫函數(shù)吧,現(xiàn)在HAL庫結(jié)合CUBE,一些基本的設(shè)置代碼都是機器生成了,作為學(xué)習(xí)者重點只需要放在了解相關(guān)概念即可,花費大量精力去死記硬背這些東西根本不值得,我到現(xiàn)在,32最基本的配置個IO口,如果我不查資料不復(fù)制,就算使用庫函數(shù),直接用鍵盤敲估計我都敲不出來.更不要說配置其他的,但這根本不影響我使用32,只要我看看例程,我就知道我改哪里就能達(dá)到我需要的效果,然后直接復(fù)制即可,或者干脆整理下,下次直接#include,學(xué)習(xí)單片機,沒有任何東西是需要死記硬背的,雖然學(xué)習(xí)的時候看下寄存器是好事,但是實際中,這種代碼可讀性太差了,不要說別人寫的,就算自己寫的,隔個幾天再看也難看懂,就算要寫寄存器風(fēng)格的,起碼也寫在函數(shù)里,然后函數(shù)名用個一看就懂的名字(其實庫函數(shù)也是這么干的),實際項目也遠(yuǎn)非點亮個LED這么簡單.你試想你拿到幾千上萬行這種風(fēng)格的代碼會是如何感受?對于寄存器,當(dāng)故事書一樣,看一看即可.初學(xué)32,多半是51過來的,建議你試試把以前51的代碼,移植過來,這既能幫你復(fù)習(xí)以前掌握的,又能對你初步了解32起一定幫助作用.
回復(fù)

使用道具 舉報

ID:584691 發(fā)表于 2019-7-15 20:47 | 顯示全部樓層
沒有運行那部分代碼
回復(fù)

使用道具 舉報

ID:371529 發(fā)表于 2019-7-16 09:01 | 顯示全部樓層
cjm82 發(fā)表于 2019-7-16 00:47
建議還是用庫函數(shù)吧,現(xiàn)在HAL庫結(jié)合CUBE,一些基本的設(shè)置代碼都是機器生成了,作為學(xué)習(xí)者重點只需要放在了解相 ...

嗯嗯好的,非常感謝您的回復(fù)!
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2019-7-16 09:57 | 顯示全部樓層
即然“程序無錯”,就應(yīng)該是天氣不好,天運來了就好了。
回復(fù)

使用道具 舉報

ID:584881 發(fā)表于 2019-7-16 10:13 | 顯示全部樓層
抱歉,兄弟,我學(xué)的是庫函數(shù)板,而且還沒學(xué)幾天
回復(fù)

使用道具 舉報

ID:424805 發(fā)表于 2019-7-16 10:20 | 顯示全部樓層
我們常用的 IO 端口寄存器只有 4 個:CRL、CRH、IDR、ODR。
void LED_Init(void) {  RCC->APB2ENR|=1<<3;    //使能 PORTB 時鐘        RCC->APB2ENR|=1<<6;    //使能 PORTE 時鐘         GPIOB->CRL&=0XFF0FFFFF;   GPIOB->CRL|=0X00300000;//PB.5 推挽輸出          GPIOB->ODR|=1<<5;      //PB.5 輸出高             GPIOE->CRL&=0XFF0FFFFF;  GPIOE->CRL|=0X00300000;//PE.5 推挽輸出  GPIOE->ODR|=1<<5;      //PE.5 輸出高  }  
回復(fù)

使用道具 舉報

ID:73666 發(fā)表于 2019-7-16 11:00 | 顯示全部樓層
GPIO_ODR  &=~(1<<1); //亮           delay(500000);         GPIO_ODR  &=~(0<<1);//滅
回復(fù)

使用道具 舉報

ID:73666 發(fā)表于 2019-7-16 11:00 | 顯示全部樓層
  1. GPIO_ODR  &=~(1<<1); //亮
  2. delay(500000);
  3. GPIO_ODR  &=~(0<<1);//滅
復(fù)制代碼

這是什么鬼
回復(fù)

使用道具 舉報

ID:371529 發(fā)表于 2019-7-17 16:53 | 顯示全部樓層
感謝各位,現(xiàn)已解決,附代碼見下。
啊吐槽一句32果然比51復(fù)雜多了,配置寄存器真是腦殼疼。

#include "stm32f10x.h"//從底層學(xué)習(xí)
#include "stm32f10x_gpio.h"//從頭文件中調(diào)用函數(shù)

typedef unsigned int u16;
void delay(u16 i)
{
        while(i--);       
}

//此為工程模版

int main (void)//亮藍(lán)光
{
        #if 0
       
        //打開GPIOB端口的時鐘
  RCC_APB2ENR  |=((1)<<3);
       
        //配置IO口為輸出
  GPIO_CRL &=~((0x0f)<<(4*1)); // 將原狀態(tài)全部清零
        GPIO_CRL |=((1)<<(4*1));
       
        //控制ODR寄存器 PB1
       
   #elif 0
               
        //打開GPIOB端口的時鐘
  RCC->APB2ENR  |=((1)<<3);
       
        //配置IO口為輸出
  GPIOB->CRL &=~((0x0f)<<(4*1)); // 將原狀態(tài)全部清零
        GPIOB->CRL |=((1)<<(4*1));//置1操作,10進(jìn)制的1  0001
       
        //控制ODR寄存器 PB1
        GPIOB->ODR  &=~(1<<1);//清零操作
       
        #elif 1
        GPIO_InitTypeDef  GPIO_InitStructure;//變量定義位于函數(shù)開頭,靠近大括號
       
//  GPIO_InitStructure.GPIO_Pin        =GPIO_Pin_0;
//  GPIO_InitStructure.GPIO_Mode        =GPIO_Mode_OUT_PP;
//        GPIO_InitStructure.GPIO_Speed        =GPIO_Speed_50MHz;
//        //配置好后將這些值寫入寄存器中 此時調(diào)用GPIO_Init函數(shù)
//        GPIO_Init( GPIOB, &GPIO_InitStructure);//變量取地址用&

/*需要先打開時鐘再配置IO口,否則無反應(yīng)*/

    //打開GPIOB端口的時鐘
  RCC->APB2ENR  |=((1)<<3);
       
   GPIO_InitStructure.GPIO_Pin        =GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode        =GPIO_Mode_OUT_PP;
        GPIO_InitStructure.GPIO_Speed        =GPIO_Speed_50MHz;
        //配置好后將這些值寫入寄存器中 此時調(diào)用GPIO_Init函數(shù)
        GPIO_Init( GPIOB, &GPIO_InitStructure);//變量取地址用&
       
  //置位取1,燈滅
  GPIO_SetBits(GPIOB,GPIO_Pin_5);//傳入第一個形參GPIOB,5腳亮紅光   
  
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
       
        while (1)
        {
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
                delay(0xFFFF);
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    delay(0xFFFF);               
        }
       
       
    #endif
}




void SystemInit(void)//start_stm32f10x_hd.s中啟動匯編時調(diào)用了SystemInit
{
  //函數(shù)體為空,目的是為了騙過編譯器不報錯
}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表