欢赢 2023-10-09 14:25 采纳率: 100%
浏览 5
已结题

(标签-stm32|关键词-m3)

把代码烧进stm32f103c8t6芯片中,从新烧入检测不到芯片


#ifndef LED__H_
#define LED__H_
#include "sys.h"//#include "stm32f10x.h"
//#define LED1 PCout(13)
 
#define RCLK_PORT        GPIOB
#define RCLK_PIN         GPIO_Pin_5
#define RCLK_PORT_RCC    RCC_APB2Periph_GPIOB
 
#define SRCLK_PORT        GPIOB
#define SRCLK_PIN         GPIO_Pin_3
#define SRCLK_PORT_RCC    RCC_APB2Periph_GPIOB
 
#define SER_PORT        GPIOB
#define SER_PIN         GPIO_Pin_4
#define SER_PORT_RCC    RCC_APB2Periph_GPIOB
 
//GPIO 0->15
#define LEDDZ_COL_PORT        GPIOA
#define LEDDZ_COL_PIN     GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
 
#define LEDDZ_COL_PORT_RCC    RCC_APB2Periph_GPIOA
 
#define SER     PBout(4)
#define RCLK     PBout(5)
#define SRCLK     PBout(3)
 
#define SRC    PBout(2)
 
void LEDInit(void);
void LEDDZ_ROW_Write_data(u8 dat);
 
#endif  //LED__H_
 
#include "led.h"
#include "delay.h"
void LEDInit()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    //1.¿ªÆôÓ²¼þʱÖÓ
    RCC_APB2PeriphClockCmd(RCLK_PORT_RCC,ENABLE);
    RCC_APB2PeriphClockCmd(SRCLK_PORT_RCC,ENABLE);
    RCC_APB2PeriphClockCmd(SER_PORT_RCC ,ENABLE);
    RCC_APB2PeriphClockCmd(LEDDZ_COL_PORT_RCC ,ENABLE);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
    
    
    GPIO_InitStruct.GPIO_Pin=RCLK_PIN;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(RCLK_PORT,&GPIO_InitStruct);
    
    
    GPIO_InitStruct.GPIO_Pin=SRCLK_PIN;
   GPIO_Init(SRCLK_PORT,&GPIO_InitStruct);
     
     GPIO_InitStruct.GPIO_Pin=SER_PIN;
   GPIO_Init(SER_PORT,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin=LEDDZ_COL_PIN;
   GPIO_Init(LEDDZ_COL_PORT,&GPIO_InitStruct);
    
    
}
 
void LEDDZ_ROW_Write_data(u8 dat){
    
    u8 i=0;
    for(i=0;i<8;i++){
        
        SER=dat>>7;
        SRCLK=0;
        delay_us(1);
        SRCLK=1;
        delay_us(1);
        
    }
    RCLK=0;
    delay_us(1);
    RCLK=1;
    
}
 
void LEDDZ_COL_Write_Data(u8 data ){
 
    u8 i=0;
 
    
 
}
 


#include "stm32f10x.h"
#include "delay.h" // ??????????
#include "led.h"
 
 
int main(void) {
  
    int i;
    
delay_init();
LEDInit();    
    while(1){
        for(i=0;i<8;i++){
            GPIO_Write(GPIOA,0x01<<1);
            delay_us(100);
        }
    
    }
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-09 16:04
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7504390
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:第一章——stm32f103建立工程
    • 您还可以看一下 Abel小智老师的嵌入式开发系统学习路线 从基础到项目 精品教程 工程师必备课程 物联网课程中的 STM32接线与下载第一个程序小节, 巩固相关知识点
    • 除此之外, 这篇博客: 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树中的 介绍STM32启动方式 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      首先提问大家一个问题就是,单片机的程序是从哪里开始执行的?
      有的小伙伴可能会说,当然是从main函数开始执行了。
      这对也不对,因为main函数执行用户程序起点而不是单片机执行的起点。而单片机的起点是哪里呢?
      在这里插入图片描述
      我们可以在STM32芯片手册中的这一段找到答案。

      代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。

      也就是说STM32单片机在上电那一刻是从地址0x0000 0000开始执行的再通过选择启动方式,我们默认是从主闪存存储器启动,也就是0x0800 0000启动
      在这里插入图片描述
      在这里插入图片描述
      而这也正好对应了,下载器默认的下载地址。
      而我们知道了单片机是从0x0000 0000开始执行,再通过选择启动方式为主闪存存储器启动的0x0800 0000之后呢,之后是执行什么?
      之后就是执行编译器编译下载到单片机当中的程序了。
      那就有同学会说是不是就是执行main函数了?
      其实还不是执行main函数,而是执行一段汇编代码,这段代码也就是stm32的启动文件startup_stm32f103xb.s
      在这里插入图片描述
      我们来简单看一下这段汇编文件,首先就是对系统内存的堆栈内存分配。

      Stack_Size		EQU     0x400
      
                      AREA    STACK, NOINIT, READWRITE, ALIGN=3
      Stack_Mem       SPACE   Stack_Size
      __initial_sp
      
      
      ; <h> Heap Configuration
      ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
      ; </h>
      
      Heap_Size      EQU     0x200
      
                      AREA    HEAP, NOINIT, READWRITE, ALIGN=3
      __heap_base
      Heap_Mem        SPACE   Heap_Size
      __heap_limit
      
                      PRESERVE8
                      THUMB
      

      分配给系统栈0x400也就是1KB
      分配给系统堆0x200也就是512字节

      ; Vector Table Mapped to Address 0 at Reset
                      AREA    RESET, DATA, READONLY
                      EXPORT  __Vectors
                      EXPORT  __Vectors_End
                      EXPORT  __Vectors_Size
      
      __Vectors       DCD     __initial_sp               ; Top of Stack
                      DCD     Reset_Handler              ; Reset Handler
                      DCD     NMI_Handler                ; NMI Handler
                      DCD     HardFault_Handler          ; Hard Fault Handler
                      DCD     MemManage_Handler          ; MPU Fault Handler
                      DCD     BusFault_Handler           ; Bus Fault Handler
                      DCD     UsageFault_Handler         ; Usage Fault Handler
                      DCD     0                          ; Reserved
                      DCD     0                          ; Reserved
                      DCD     0                          ; Reserved
                      DCD     0                          ; Reserved
                      DCD     SVC_Handler                ; SVCall Handler
                      DCD     DebugMon_Handler           ; Debug Monitor Handler
                      DCD     0                          ; Reserved
                      DCD     PendSV_Handler             ; PendSV Handler
                      DCD     SysTick_Handler            ; SysTick Handler
      
                      ; External Interrupts
                      DCD     WWDG_IRQHandler            ; Window Watchdog
                      DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                      DCD     TAMPER_IRQHandler          ; Tamper
                      DCD     RTC_IRQHandler             ; RTC
                      DCD     FLASH_IRQHandler           ; Flash
                      DCD     RCC_IRQHandler             ; RCC
                      DCD     EXTI0_IRQHandler           ; EXTI Line 0
                      DCD     EXTI1_IRQHandler           ; EXTI Line 1
                      DCD     EXTI2_IRQHandler           ; EXTI Line 2
                      DCD     EXTI3_IRQHandler           ; EXTI Line 3
                      DCD     EXTI4_IRQHandler           ; EXTI Line 4
                      DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                      DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                      DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                      DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                      DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                      DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                      DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                      DCD     ADC1_2_IRQHandler          ; ADC1_2
                      DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                      DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                      DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                      DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                      DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                      DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                      DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                      DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                      DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                      DCD     TIM2_IRQHandler            ; TIM2
                      DCD     TIM3_IRQHandler            ; TIM3
                      DCD     TIM4_IRQHandler            ; TIM4
                      DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                      DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                      DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                      DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                      DCD     SPI1_IRQHandler            ; SPI1
                      DCD     SPI2_IRQHandler            ; SPI2
                      DCD     USART1_IRQHandler          ; USART1
                      DCD     USART2_IRQHandler          ; USART2
                      DCD     USART3_IRQHandler          ; USART3
                      DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                      DCD     RTC_Alarm_IRQHandler        ; RTC Alarm through EXTI Line
                      DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
      __Vectors_End
      

      建立中断向量表
      不知道大家刚刚学习单片机中断的时候有没有疑惑过,为什么中断服务函数不用函数声明。
      我当时就十分不解为什么中断服务函数没有函数声明呢?那发生中断时系统怎么知道去哪执行中断服务函数呢?
      而启动文件当中这段内容就是建立中断向量表的过程,实际上就是告诉系统,当发生中断时要去哪里执行。
      而函数声明的过程实际上也是告诉系统函数的地址,当调用函数时去哪里执行。(函数名实际上就是地址)所以建立中断向量表实际上也就是相当于函数声明了。

      ; Reset handler
      Reset_Handler    PROC
                       EXPORT  Reset_Handler             [WEAK]
           IMPORT  __main
           IMPORT  SystemInit
                       LDR     R0, =SystemInit
                       BLX     R0
                       LDR     R0, =__main
                       BX      R0
                       ENDP
      
      

      而这一段大概就是声明了两个函数SystemInit和__main
      这里面的__main就是大家所写的那个main函数,而SystemInit
      在这里插入图片描述
      就是在system_stm32f1xx.c中的一个函数,由此可见在执行用户的main函数之前还要执行一个SystemInit函数,而这个函数就是系统初始化函数,进行一些时钟配置等等。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 创建了问题 10月9日

悬赏问题

  • ¥15 为什么shp文件会有这种小方块?
  • ¥15 ecplise在连接数据库时显示加载驱动成功但是数据库连接失败
  • ¥15 visionmaster启动失败,提示为“机器不满足授权而被禁用”
  • ¥50 用logisim设计16位单时钟周期cpu
  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 Multisim红外倒车雷达仿真中距离问题
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应