草庐IT

2022-2-23作业

无限复读叽 2023-04-08 原文

一、通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1.例如在串口输入led1on,开饭led1灯点亮

2.例如在串口输入led1off,开饭led1灯熄灭

3.例如在串口输入led2on,开饭led2灯点亮

4.例如在串口输入led2off,开饭led2灯熄灭

5.例如在串口输入led3on,开饭led3灯点亮

6.例如在串口输入led3off,开饭led3灯熄灭

二、检测中断到来时,让LED灯状态取反,并且在串口工具上打印一句话

例如:当按键1按下之后,让LED1状态取反,并打印“LED1 down”

        当按键2按下之后,让LED2状态取反,并打印“LED2 down”

        当按键3按下之后,让LED3状态取反,并打印“LED3 down”

        火焰传感器/人体红外/光电开关实验要求如上 


作业一:

stm32mp1xx_rcc.h:

#ifndef __STM32MP1XX_RCC_H__
#define __STM32MP1XX_RCC_H__ 

typedef struct {
	volatile unsigned int TZCR;     	// 0x000
	volatile unsigned int res1[2]; 		// 0x004-0x008
	volatile unsigned int OCENSETR;     // 0x00C
	volatile unsigned int OCENCLRR;  	// 0x010
	volatile unsigned int res2[1]; 		// 0x014
	volatile unsigned int HSICFGR; 		// 0x018
	volatile unsigned int CSICFGR; 		// 0x01C
	volatile unsigned int MPCKSELR; 	// 0x020
	volatile unsigned int ASSCKSELR; 	// 0x024
	volatile unsigned int PCK12SELR; 	// 0x028
	volatile unsigned int MPCKDIVR; 	// 0x02C
	volatile unsigned int AXIDIVR; 		// 0x030
	volatile unsigned int res3[2];      
	volatile unsigned int APB4DIVR; 	// 0x03C
	volatile unsigned int APB5DIVR; 	// 0x040
	volatile unsigned int RTCDIVR; 		// 0x044
	volatile unsigned int MSSCKSELR;    // 0x048
	volatile unsigned int res4[13];
	volatile unsigned int PLL1CR; 		// 0x080
	volatile unsigned int PLL1CFGR1; 	// 0x084
	volatile unsigned int PLL1CFGR2; 	// 0x088
	volatile unsigned int PLL1FRACR; 	// 0x08C
	volatile unsigned int PLL1CSGR;     // 0x090
	volatile unsigned int PLL2CR; 		// 0x094
	volatile unsigned int PLL2CFGR1; 	// 0x098
	volatile unsigned int PLL2CFGR2; 	// 0x09C
	volatile unsigned int PLL2FRACR;    // 0x0A0
	volatile unsigned int PLL2CSGR;     // 0x0A4
	volatile unsigned int res5[6];
	volatile unsigned int I2C46CKSELR;  // 0x0C0
	volatile unsigned int SPI6CKSELR;   // 0x0C4
	volatile unsigned int UART1CKSELR;  // 0x0C8
	volatile unsigned int RNG1CKSELR;   // 0x0CC
	volatile unsigned int CPERCKSELR;   // 0x0D0
	volatile unsigned int STGENCKSELR;  // 0x0D4
	volatile unsigned int DDRITFCR; 	// 0x0D8
	volatile unsigned int res6[9];
	volatile unsigned int MP_BOOTCR;  	// 0x100
	volatile unsigned int MP_SREQSETR;  // 0x104
	volatile unsigned int MP_SREQCLRR;  // 0x108
	volatile unsigned int MP_GCR;  		// 0x10C
	volatile unsigned int MP_APRSTCR; 	// 0x110 
	volatile unsigned int MP_APRSTSR;   // 0x114
	volatile unsigned int res7[10];
	volatile unsigned int BDCR; 		// 0x140
	volatile unsigned int RDLSICR;  	// 0x144
	volatile unsigned int res8[14];
	volatile unsigned int APB4RSTSETR; 	// 0x180
	volatile unsigned int APB4RSTCLRR; 	// 0x184
	volatile unsigned int APB5RSTSETR;  // 0x188
	volatile unsigned int APB5RSTCLRR;  // 0x18C
	volatile unsigned int AHB5RSTSETR;  // 0x190
	volatile unsigned int AHB5RSTCLRR;  // 0x194
	volatile unsigned int AHB6RSTSETR;  // 0x198
	volatile unsigned int AHB6RSTCLRR;  // 0x19C
	volatile unsigned int TZAHB6RSTSELR;// 0x1A0
	volatile unsigned int TZAHB6RSTCLRR;// 0x1A4
	volatile unsigned int res9[22];
	volatile unsigned int MP_APB4ENSETR;// 0x200
	volatile unsigned int MP_APB4ENCLRR;// 0x204
	volatile unsigned int MP_APB5ENSETR;// 0x208
	volatile unsigned int MP_APB5ENCLRR;// 0x20C
	volatile unsigned int MP_AHB5ENSETR;// 0x210
	volatile unsigned int MP_AHB5ENCLRR;// 0x214
	volatile unsigned int MP_AHB6ENSETR;// 0x218
	volatile unsigned int MP_AHB6ENCLRR;// 0x21C
	volatile unsigned int MP_TZAHB6ENSELR;// 0x220
	volatile unsigned int MP_TZAHB6ENCLRR;// 0x224
	volatile unsigned int res10[22];
	volatile unsigned int MC_APB4ENSETR; // 0x280
	volatile unsigned int MC_APB4ENCLRR; // 0x284
	volatile unsigned int MC_APB5ENSETR; // 0x288
	volatile unsigned int MC_APB5ENCLRR; // 0x28C
	volatile unsigned int MC_AHB5ENSETR; // 0x290
	volatile unsigned int MC_AHB5ENCLRR; // 0x294
	volatile unsigned int MC_AHB6ENSETR; // 0x298
	volatile unsigned int MC_AHB6ENCLRR; // 0x29C
	volatile unsigned int res11[24];
	volatile unsigned int MP_APB4LPENSETR; // 0x300
	volatile unsigned int MP_APB4LPENCLRR; // 0x304
	volatile unsigned int MP_APB5LPENSETR; // 0x308
	volatile unsigned int MP_APB5LPENCLRR; // 0x30C
	volatile unsigned int MP_AHB5LPENSETR; // 0x310
	volatile unsigned int MP_AHB5LPENCLRR; // 0x314
	volatile unsigned int MP_AHB6LPENSETR; // 0x318
	volatile unsigned int MP_AHB6LPENCLRR; // 0x31C
	volatile unsigned int MP_TZAHB6LPENSETR; // 0x320
	volatile unsigned int MP_TZAHB6LPENCLRR; // 0x324
	volatile unsigned int res12[22];
	volatile unsigned int MC_APB4LPENSETR; // 0x380
	volatile unsigned int MC_APB4LPENCLRR; // 0x384
	volatile unsigned int MC_APB5LPENSETR; // 0x388
	volatile unsigned int MC_APB5LPENCLRR; // 0x38C
	volatile unsigned int MC_AHB5LPENSETR; // 0x390
	volatile unsigned int MC_AHB5LPENCLRR; // 0x394
	volatile unsigned int MC_AHB6LPENSETR; // 0x398
	volatile unsigned int MC_AHB6LPENCLRR; // 0x39C
	volatile unsigned int res13[24];
	volatile unsigned int BR_RSTSCLRR; 		// 0x400
	volatile unsigned int MP_GRSTCSETR; 	// 0x404
	volatile unsigned int MP_RSTSR; 		// 0x408 
	volatile unsigned int MP_IWDGFZSETR; 	// 0x40C
	volatile unsigned int MP_IWDGFZCLRR;  	// 0x410
	volatile unsigned int MP_CIER; 			// 0x414
	volatile unsigned int MP_CIFR; 			// 0x418
	volatile unsigned int PWRLPDLYCR; 		// 0x41C
	volatile unsigned int MP_RSTSS; 		// 0x420
	volatile unsigned int res14[247];
	volatile unsigned int MCO1CFGR; 		// 0x800
	volatile unsigned int MCO2CFGR; 		// 0x804 
	volatile unsigned int OCRDYR; 			// 0x808
	volatile unsigned int DBGCFGR; 			// 0x80C
	volatile unsigned int res15[4];
	volatile unsigned int RCK3SELR; 		// 0x820
	volatile unsigned int RCK4SELR; 		// 0x824
	volatile unsigned int TIMG1PRER;  		// 0x828
	volatile unsigned int TIMG2PRER; 		// 0x82C
	volatile unsigned int MCUDIVR; 			// 0x830
	volatile unsigned int APB1DIVR; 		// 0x834
	volatile unsigned int APB2DIVR; 		// 0x838
	volatile unsigned int APB3DIVR; 		// 0x83C
	volatile unsigned int res16[16];
	volatile unsigned int PLL3CR;   		// 0x880
	volatile unsigned int PLL3CFGR1; 		// 0x884
	volatile unsigned int PLL3CFGR2; 		// 0x888
	volatile unsigned int PLL3FRACR; 		// 0x88C
	volatile unsigned int PLL3CSGR; 		// 0x890
	volatile unsigned int PLL4CR; 			// 0x894
	volatile unsigned int PLL4CFGR1; 		// 0x898
	volatile unsigned int PLL4CFGR2; 		// 0x89C
	volatile unsigned int PLL4FRACR; 		// 0x8A0
	volatile unsigned int PLL4CSGR; 		// 0x8A4
	volatile unsigned int res17[6];
	volatile unsigned int I2C12CKSELR; 		// 0x8C0
	volatile unsigned int I2C35CKSELR;  	// 0x8C4
	volatile unsigned int SAI1CKSELR; 		// 0x8C8
	volatile unsigned int SAI2CKSELR; 		// 0x8CC
	volatile unsigned int SAI3CKSELR; 		// 0x8D0
	volatile unsigned int SAI4CKSELR; 		// 0x8D4
	volatile unsigned int SPI2S1CKSELR; 	// 0x8D8
	volatile unsigned int SPI2S23CKSELR; 	// 0x8DC
	volatile unsigned int SPI45CKSELR; 		// 0x8E0
	volatile unsigned int UART6CKSELR; 		// 0x8E4
	volatile unsigned int UART24CKSELR; 	// 0x8E8
	volatile unsigned int UART35CKSELR; 	// 0x8EC
	volatile unsigned int UART78CKSELR; 	// 0x8F0
	volatile unsigned int SDMMC12CKSELR; 	// 0x8F4
	volatile unsigned int SDMMC3CKSELR; 	// 0x8F8
	volatile unsigned int ETHCKSELR; 		// 0x8FC
	volatile unsigned int QSPICKSELR; 		// 0x900
	volatile unsigned int FMCCKSELR; 		// 0x904
	volatile unsigned int res18[1];
	volatile unsigned int FDCANCKSELR; 		// 0x90C
	volatile unsigned int res19[1];
	volatile unsigned int SPDIFCKSELR; 		// 0x914
	volatile unsigned int CECCKSELR; 		// 0x918
	volatile unsigned int USBCKSELR; 		// 0x91C
	volatile unsigned int RNG2CKSELR;  		// 0x920
	volatile unsigned int DSICKSELR; 		// 0x924
	volatile unsigned int ADCCKSELR; 		// 0x928
	volatile unsigned int LPTIM45CKSELR; 	// 0x92C
	volatile unsigned int LPTIM23CKSELR;    // 0x930
	volatile unsigned int LPTIM1CKSELR; 	// 0x934
	volatile unsigned int res20[18];
	volatile unsigned int APB1RSTSETR; 		// 0x980
	volatile unsigned int APB1RSTCLRR; 		// 0x984
	volatile unsigned int APB2RSTSETR; 		// 0x988
	volatile unsigned int APB2RSTCLRR; 		// 0x98C
	volatile unsigned int APB3RSTSETR; 		// 0x990
	volatile unsigned int APB3RSTCLRR; 		// 0x994
	volatile unsigned int AHB2RSTSETR; 		// 0x998
	volatile unsigned int AHB2RSTCLRR;  	// 0x99C
	volatile unsigned int AHB3RSTSETR; 		// 0x9A0
	volatile unsigned int AHB3RSTCLRR; 		// 0x9A4
	volatile unsigned int AHB4RSTSETR; 		// 0x9A8
	volatile unsigned int AHB4RSTCLRR; 		// 0x9AC
	volatile unsigned int res21[20];
	volatile unsigned int MP_APB1ENSETR; 	// 0xA00
	volatile unsigned int MP_APB1ENCLRR; 	// 0xA04
	volatile unsigned int MP_APB2ENSETR; 	// 0xA08
	volatile unsigned int MP_APB2ENCLRR;  	// 0xA0C
	volatile unsigned int MP_APB3ENSETR; 	// 0xA10
	volatile unsigned int MP_APB3ENCLRR; 	// 0xA14
	volatile unsigned int MP_AHB2ENSETR; 	// 0xA18
	volatile unsigned int MP_AHB2ENCLRR; 	// 0xA1C
	volatile unsigned int MP_AHB3ENSETR; 	// 0xA20
	volatile unsigned int MP_AHB3ENCLRR; 	// 0xA24
	volatile unsigned int MP_AHB4ENSETR; 	// 0xA28
	volatile unsigned int MP_AHB4ENCLRR; 	// 0xA2C
	volatile unsigned int res22[2];
	volatile unsigned int MP_MLAHBENSETR; 	// 0xA38
	volatile unsigned int MP_MLAHBENCLRR; 	// 0xA3C
	volatile unsigned int res23[16];
	volatile unsigned int MC_APB1ENSETR; 	// 0xA80
	volatile unsigned int MC_APB1ENCLRR; 	// 0xA84
	volatile unsigned int MC_APB2ENSETR; 	// 0xA88
	volatile unsigned int MC_APB2ENCLRR; 	// 0xA8C
	volatile unsigned int MC_APB3ENSETR; 	// 0xA90
	volatile unsigned int MC_APB3ENCLRR; 	// 0xA94
	volatile unsigned int MC_AHB2ENSETR; 	// 0xA98
	volatile unsigned int MC_AHB2ENCLRR; 	// 0xA9C
	volatile unsigned int MC_AHB3ENSETR; 	// 0xAA0
	volatile unsigned int MC_AHB3ENCLRR; 	// 0xAA4
	volatile unsigned int MC_AHB4ENSETR; 	// 0xAA8
	volatile unsigned int MC_AHB4ENCLRR; 	// 0xAAC
	volatile unsigned int MC_AXIMENSETR; 	// 0xAB0
	volatile unsigned int MC_AXIMENCLRR; 	// 0xAB4
	volatile unsigned int MC_MLAHBENSETR; 	// 0xAB8
	volatile unsigned int MC_MLAHBENCLRR; 	// 0xABC
	volatile unsigned int res24[16];
	volatile unsigned int MP_APB1LPENSETR; 	// 0xB00
	volatile unsigned int MP_APB1LPENCLRR; 	// 0xB04
	volatile unsigned int MP_APB2LPENSETR;  // 0xB08
	volatile unsigned int MP_APB2LPENCLRR; 	// 0xB0C
	volatile unsigned int MP_APB3LPENSETR; 	// 0xB10
	volatile unsigned int MP_APB3LPENCLRR;  // 0xB14
	volatile unsigned int MP_AHB2LPENSETR;  // 0xB18
	volatile unsigned int MP_AHB2LPENCLRR;  // 0xB1C
	volatile unsigned int MP_AHB3LPENSETR;  // 0xB20
	volatile unsigned int MP_AHB3LPENCLRR;  // 0xB24
	volatile unsigned int MP_AHB4LPENSETR;  // 0xB28
	volatile unsigned int MP_AHB4LPENCLRR;  // 0xB2C
	volatile unsigned int MP_AXIMLPENSETR;  // 0xB30
	volatile unsigned int MP_AXIMLPENCLRR;  // 0xB34
	volatile unsigned int MP_MLAHBLPENSETR; // 0xB38
	volatile unsigned int MP_MLAHBLPENCLRR; // 0xB3C
	volatile unsigned int res25[16];
	volatile unsigned int MC_APB1LPENSETR;  // 0xB80
	volatile unsigned int MC_APB1LPENCLRR; 	// 0xB84
	volatile unsigned int MC_APB2LPENSETR;  // 0xB88
	volatile unsigned int MC_APB2LPENCLRR;  // 0xB8C
	volatile unsigned int MC_APB3LPENSETR;  // 0xB90 
	volatile unsigned int MC_APB3LPENCLRR;  // 0xB94
	volatile unsigned int MC_AHB2LPENSETR;  // 0xB98
	volatile unsigned int MC_AHB2LPENCLRR;  // 0xB9C
	volatile unsigned int MC_AHB3LPENSETR;  // 0xBA0 
	volatile unsigned int MC_AHB3LPENCLRR;  // 0xBA4
	volatile unsigned int MC_AHB4LPENSETR;  // 0xBA8
	volatile unsigned int MC_AHB4LPENCLRR;  // 0xBAC
	volatile unsigned int MC_AXIMLPENSETR;  // 0xBB0
	volatile unsigned int MC_AXIMLPENCLRR;  // 0xBB4
	volatile unsigned int MC_MLAHBLPENSETR; // 0xBB8
	volatile unsigned int MC_MLAHBLPENCLRR; // 0xBBC
	volatile unsigned int res26[16];
	volatile unsigned int MC_RSTSCLRR;  	// 0xC00
	volatile unsigned int res27[4];
	volatile unsigned int MC_CIER;  		// 0xC14
	volatile unsigned int MC_CIFR; 			// 0xC18
	volatile unsigned int res28[246];
	volatile unsigned int VERR; 			// 0xFF4
	volatile unsigned int IDR; 				// 0xFF8
	volatile unsigned int SIDR; 			// 0xFFC
}rcc_t;

#define RCC   ((rcc_t *)0x50000000)

#endif  // __STM32MP1XX_RCC_H__

stm32mp1xx_gpio.h:

#ifndef __STM32MP1xx_GPIO_H__
#define __STM32MP1xx_GPIO_H__

typedef struct {
	volatile unsigned int MODER;   // 0x00
	volatile unsigned int OTYPER;  // 0x04
	volatile unsigned int OSPEEDR; // 0x08
	volatile unsigned int PUPDR;   // 0x0C
	volatile unsigned int IDR;     // 0x10
	volatile unsigned int ODR;     // 0x14
	volatile unsigned int BSRR;    // 0x18
	volatile unsigned int LCKR;    // 0x1C 
	volatile unsigned int AFRL;    // 0x20 
	volatile unsigned int AFRH;    // 0x24
	volatile unsigned int BRR;     // 0x28
	volatile unsigned int res;
	volatile unsigned int SECCFGR; // 0x30

}gpio_t;

#define  GPIOA   ((gpio_t *)0x50002000)
#define  GPIOB   ((gpio_t *)0x50003000)
#define  GPIOC   ((gpio_t *)0x50004000)
#define  GPIOD   ((gpio_t *)0x50005000)
#define  GPIOE   ((gpio_t *)0x50006000)
#define  GPIOF   ((gpio_t *)0x50007000)
#define  GPIOG   ((gpio_t *)0x50008000)
#define  GPIOH   ((gpio_t *)0x50009000)
#define  GPIOI   ((gpio_t *)0x5000A000)
#define  GPIOJ   ((gpio_t *)0x5000B000)
#define  GPIOK   ((gpio_t *)0x5000C000)
#define  GPIOZ   ((gpio_t *)0x54004000)

//对引脚进行封装      
#define GPIO_PIN_0 0  
#define GPIO_PIN_1 1  
#define GPIO_PIN_2 2  
#define GPIO_PIN_3 3  
#define GPIO_PIN_4 4  
#define GPIO_PIN_5 5  
#define GPIO_PIN_6 6  
#define GPIO_PIN_7 7  
#define GPIO_PIN_8 8  
#define GPIO_PIN_9 9  
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15

//寄存器输出模式           
typedef enum{              
    Input,                 
    Output,                
    Alternate,        
    Analog,                
}gpio_moder_t;             
                           
//寄存器输出类型           
typedef enum{              
    Push_pull,             
    Open_drain,            
}gpio_otyper_t;            
                           
//寄存器输出速度           
typedef enum{              
    Low_speed,             
    Medium_speed,          
    High_speed,            
    Very_high_speed,       
}gpio_ospeedr_t;           
                           
//寄存器是否需要上下拉     
typedef enum{              
    No_up_down,            
    Pull_up,               
    Pull_down,             
    Reserved,              
}gpio_pupdr_t;             
                           
//对GPIO引脚状态封装       
typedef enum{              
    gpio_reset_t,          
    gpio_set_t,            
}gpio_status_t;            
                           
//对GPIO进行初始化         
typedef struct{            
    gpio_moder_t moder;    
    gpio_otyper_t otyper;  
    gpio_ospeedr_t ospeedr;
    gpio_pupdr_t pupdr;    
}gpio_init_t;              

#endif // __STM32MP1xx_GPIO_H__

stm32mp1xx_uart.h:

#ifndef __STM32MP1XX_UART_H__
#define __STM32MP1XX_UART_H__

typedef struct {
	volatile unsigned int CR1;
	volatile unsigned int CR2;
	volatile unsigned int CR3;
	volatile unsigned int BRR;
	volatile unsigned int GTPR;
	volatile unsigned int RTOR;
	volatile unsigned int RQR;
	volatile unsigned int ISR;
	volatile unsigned int ICR;
	volatile unsigned int RDR;
	volatile unsigned int TDR;
	volatile unsigned int PRESC;
}uart_t;

#define USART1  ((uart_t *)0x5C000000)
#define USART2  ((uart_t *)0x4000E000)
#define USART3  ((uart_t *)0x4000F000)
#define USART4  ((uart_t *)0x40010000)
#define USART5  ((uart_t *)0x40011000)
#define USART6  ((uart_t *)0x44003000)
#define USART7  ((uart_t *)0x40018000)
#define USART8  ((uart_t *)0x40019000)

#endif // __STM32MP1XX_UART_H__

stm32mp1xx_exti.h:

#ifndef __STM32MP1XX_EXTI_H__
#define __STM32MP1XX_EXTI_H__

typedef struct{
	volatile unsigned int RTSR1; 	// EXTI rising trigger selection register 	
	volatile unsigned int FTSR1; 	// EXTI falling trigger selection register	
	volatile unsigned int SWIER1;   // EXTI software interrupt event register 
	volatile unsigned int RPR1;     // EXTI rising edge pending register
	volatile unsigned int FPR1;  	// EXTI falling edge pending register
	volatile unsigned int TZENR1;   // EXTI TrustZone enable register
	volatile unsigned int RES1[2];  
	volatile unsigned int RTSR2;    // EXTI rising trigger selection register
	volatile unsigned int FTSR2;    // EXTI falling trigger selection register
	volatile unsigned int SWIER2;   // EXTI software interrupt event register
	volatile unsigned int RPR2;     // EXTI rising edge pending register
	volatile unsigned int FPR2;	    // EXTI falling edge pending register
	volatile unsigned int TZENR2;   // EXTI TrustZone enable register
	volatile unsigned int RES2[2];
	volatile unsigned int RTSR3;    // EXTI rising trigger selection register
	volatile unsigned int FTSR3;    // EXTI falling trigger selection register
	volatile unsigned int SWIER3;   // EXTI software interrupt event register
	volatile unsigned int RPR3;     // EXTI rising edge pending register
	volatile unsigned int FPR3;     // EXTI falling edge pending register
	volatile unsigned int TZENR3;   // EXTI TrustZone enable register
	volatile unsigned int RES3[2];
	volatile unsigned int EXTICR1;	// EXTI external interrupt selection register 1
	volatile unsigned int EXTICR2;  // EXTI external interrupt selection register 2	
	volatile unsigned int EXTICR3;  // EXTI external interrupt selection register 3	
	volatile unsigned int EXTICR4;  // EXTI external interrupt selection register 4	
	volatile unsigned int RES4[4];
	volatile unsigned int C1IMR1;   // EXTI CPU1 wakeup with interrupt mask register
	volatile unsigned int C1EMR1;   // EXTI CPU1 wakeup with event mask register
	volatile unsigned int RES5[2];
	volatile unsigned int C1IMR2;   // EXTI CPU1 wakeup with interrupt mask register
	volatile unsigned int C1EMR2;   // EXTI CPU1 wakeup with event mask register
	volatile unsigned int RES6[2];
	volatile unsigned int C1IMR3;   // EXTI CPU1 wakeup with interrupt mask register	
	volatile unsigned int C1EMR3;   // EXTI CPU1 wakeup with event mask register 
	volatile unsigned int RES7[6];
	volatile unsigned int C2IMR1;   // EXTI CPU2 wakeup with interrupt mask register
	volatile unsigned int C2EMR1;   // EXTI CPU2 wakeup with event mask register
	volatile unsigned int RES8[2];
	volatile unsigned int C2IMR2;   // EXTI CPU2 wakeup with interrupt mask register
	volatile unsigned int C2EMR2;   // EXTI CPU2 wakeup with event mask register
	volatile unsigned int RES9[2];
	volatile unsigned int C2IMR3;   // EXTI CPU2 wakeup with interrupt mask register 
	volatile unsigned int C2EMR3;   // EXTI CPU2 wakeup with event mask register 
	volatile unsigned int RES10[2];
}exti_t;

#define  EXTI   ((exti_t*)0x5000D000)

#endif //__STM32MP1XX_EXTI_H__

stm32mp1xx_gic.h:

#ifndef __STM32MP1XX_GIC_H__
#define __STM32MP1XX_GIC_H__ 


typedef struct {
	volatile unsigned int CTRL;
	volatile unsigned int TYPER;
	volatile unsigned int IIDR;
	volatile unsigned int RES1[29];
	volatile unsigned int IGROUPR[9];
	volatile unsigned int RES2[23];
	volatile unsigned int ISENABLER[9];
	volatile unsigned int RES3[23];
	volatile unsigned int ICENABLER[9];
	volatile unsigned int RES4[23];
	volatile unsigned int ISPENDR[9];
	volatile unsigned int RES5[23];
	volatile unsigned int ICPENDR[9];
	volatile unsigned int RES6[23];
	volatile unsigned int ISACTIVER[9];
	volatile unsigned int RES7[23];
	volatile unsigned int ICACTIVER[9];
	volatile unsigned int RES8[23];
	volatile unsigned int IPRIORITYR[72];
	volatile unsigned int RES9[184];
	volatile unsigned int ITARGETSR[72];
	volatile unsigned int RES10[184];	
	volatile unsigned int ICFGR[18];
	volatile unsigned int RES11[46];

}gicd_t;
#define GICD  ((gicd_t*)0xA0021000)


typedef struct {
	volatile unsigned int CTRL;
	volatile unsigned int PMR;
	volatile unsigned int BRR;
	volatile unsigned int IAR;
	volatile unsigned int EOIR;
	volatile unsigned int RPR;
	volatile unsigned int HPPIR;
	volatile unsigned int ABPR;
	volatile unsigned int AIAR;
	volatile unsigned int AEOIR;
	volatile unsigned int AHPPIR;
	volatile unsigned int RES1[41];
	volatile unsigned int APR0;
	volatile unsigned int RES2[3];
	volatile unsigned int NSAPR0;
	volatile unsigned int RES3[6];
	volatile unsigned int IIDR;
	volatile unsigned int RES4[960];
	volatile unsigned int DIRDIR;

}gicc_t;
#define GICC  ((gicc_t*)0xA0022000) 

#endif  // __STM32MP1XX_GIC_H__

uart_led.h:

#ifndef __UART_LED_H__
#define __UART_LED_H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"

//重写strcmp函数
int strcmp(const char *s1, const char *s2);

//对LED灯初始化
void hal_led_init();

//对GPIO引脚初始化函数
void hal_gpio_init(gpio_t* gpiox, gpio_init_t* init, unsigned int pin);

//对GPIO引脚写操作函数
void hal_led_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state);

//初始化串口
void hal_uart_init();

//发送一个字节
void uart_put_char(const char str);
 
//发送一个字符串
void uart_put_string(const char* str);
 
//接受一个字符
char uart_get_char();
 
//接收一个字符串
char* uart_get_string();

#endif

uart_led.c:

#include "uart_led.h"

extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);

//重写strcmp函数
int strcmp(const char *s1, const char *s2)
{
	int t = 0;
	while(*s1 || *s2)
	{
		if(*s1 != *s2)
		{
			t = *s1 - *s2;
			return t;
		}
		*s1 ++;
		*s2 ++;
	}
	return t;
}

//对LED灯初始化
void hal_led_init()
{
	//RCC时钟初始化
	RCC->MP_AHB4ENSETR |= (0x3 << 4);

	//结构体初始化
	gpio_init_t init = {Output, Push_pull, Low_speed, No_up_down};

	//GPIO初始化
	hal_gpio_init(GPIOE, &init, GPIO_PIN_10);
	hal_gpio_init(GPIOF, &init, GPIO_PIN_10);
	hal_gpio_init(GPIOE, &init, GPIO_PIN_8);
}

//对GPIO引脚初始化函数
void hal_gpio_init(gpio_t* gpiox, gpio_init_t* init, unsigned int pin)
{
	//GPIO输出模式初始化
	gpiox->MODER &= (~(0x3 << (pin * 2)));
	gpiox->MODER |= (init->moder << (pin * 2));

	//GPIO输出类型初始化
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (init->otyper << pin);

	//GPIO输出速度初始化
	gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));
	gpiox->OSPEEDR |= (init->ospeedr << (pin * 2));

	//GPIO是否需要上下拉
	gpiox->PUPDR &= (~(0x3 << (pin * 2)));
	gpiox->PUPDR |= (init->pupdr << (pin * 2));
}

//对GPIO引脚写操作函数
void hal_led_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t state)
{
	if(gpio_reset_t == state)
		gpiox->ODR &= (~(0x1 << pin));
	else
		gpiox->ODR |= (0x1 << pin);
}

//初始化串口
void hal_uart_init()
{
	/*********RCC章节初始化********/
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	RCC->MP_AHB4ENSETR |= (0x1 << 6);
	RCC->MP_APB1ENSETR |= (0x1 << 16);
	/*********GPIO章节初始化*******/
	gpio_init_t init = {0};
	init.moder = Alternate; 	//设置GPIO模式为复用模式
	hal_gpio_init(GPIOB, &init, GPIO_PIN_2);
	hal_gpio_init(GPIOG, &init, GPIO_PIN_11);

	GPIOB->MODER |= (0x1 << 5);
	GPIOB->AFRL &= (~(0xF << 8));
	GPIOB->AFRL |= (0x1 << 11);
	GPIOG->MODER |= (0x1 << 23);
	GPIOG->AFRH &= (~(0xF << 12));
	GPIOG->AFRH |= (0x3 << 13);
	/*********UART章节初始化*******/
	if(USART4->CR1 & (0x1 << 0))    //判断UE位是否为0    
	{                                                    
		delay_ms(500);                                   
		USART4->CR1 &= (~(0x1 << 0));                    
	}                                                    
	USART4->CR1 &= (~(0x1 << 28));  //设置数据位宽度为8位
	USART4->CR1 &= (~(0x1 << 12));                       
	USART4->CR1 &= (~(0x1 << 15));  //设置串口采样率     
	USART4->CR1 &= (~(0x1 << 10));  //设置无奇偶校验位   
	USART4->CR2 &= (~(0x3 << 12));  //设置串口1位停止位  
	USART4->PRESC &= (~(0x3 << 3)); //设置串口不分频     
	USART4->BRR |= 0x22B;           //设置串口波特率     
	USART4->CR1 |= (0x1 << 2);      //串口发送器使能     
	USART4->CR1 |= (0x1 << 3);      //串口接收器使能     
	USART4->CR1 |= (0x1 << 0);          //串口使能       
}

//发送一个字节
void uart_put_char(const char str)
{
	//1.判断发送数据寄存器是否为空,为空才可以发送下一个字节
	//ISR[7]  
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器空,才可以发送下一个字节数据
	while(!(USART4->ISR & (0x1 << 7)));
 
	//2.将要发送的字符写到发送数据寄存器中
	USART4->TDR = str;
 
	//3.判断发送数据是否完成 ISR[6]
	while(!(USART4->ISR & (0x1 << 6)));
}
 
//发送一个字符串
void uart_put_string(const char* str)
{
	//判断是否为'\0',一个字符一个字符发
	for(int i = 0; str[i] != '\0'; i++)
	{
		uart_put_char(str[i]);	
	}
	printf("\n");
}
 
//接受一个字符
char uart_get_char()
{
	char ch;
	//1.判断接收数据寄存器是否有数据可读 ISR[5]
	while(!(USART4->ISR & (0x1 << 5)));
 
	//2.将接收到的数据读出来
	ch = USART4->RDR;
 
	return ch;
}
 
char buff[50] = {0};
//接收一个字符串
char* uart_get_string()
{
	int i = 0;
 
	//for循环
	//当键盘的回车键'\r'按下之后,字符串输入完成
	for(i = 0; i < 48; i++)
	{
		buff[i] = uart_get_char();	
		if(buff[i] == '\r')
			break;
		uart_put_char(buff[i]);
	}
	
	//字符串补'\0'
	buff[i] = '\0';
	printf("\n");

	//对接收到的字符串进行判断
	if(strcmp(buff,"led1on") == 0)
	{
		hal_led_gpio_write(GPIOE, GPIO_PIN_10, gpio_set_t);
		return "LED1_ON success";
	}
	else if(strcmp(buff,"led1off") == 0)
	{
		hal_led_gpio_write(GPIOE, GPIO_PIN_10, gpio_reset_t);
		return "LED1_OFF success";
	}
	else if(strcmp(buff,"led2on") == 0)
	{
		hal_led_gpio_write(GPIOF, GPIO_PIN_10, gpio_set_t);
		return "LED2_ON success";
	}
	else if(strcmp(buff,"led2off") == 0)
	{
		hal_led_gpio_write(GPIOF, GPIO_PIN_10, gpio_reset_t);
		return "LED2_OFF success";
	}
	else if(strcmp(buff,"led3on") == 0)
	{
		hal_led_gpio_write(GPIOE, GPIO_PIN_8, gpio_set_t);
		return "LED3_ON success";
	}
	else if(strcmp(buff,"led3off") == 0)
	{
		hal_led_gpio_write(GPIOE, GPIO_PIN_8, gpio_reset_t);
		return "LED3_OFF success";
	}

	return "invalid instruction!";
}

 main.c:

#include "uart_led.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

int main()
{
	hal_led_init();     //LED灯初始化
	hal_uart_init(); 	//串口初始化
	while(1)
	{
		uart_put_string(uart_get_string());
	}
	return 0;
}

测试结果如下: 


作业二:

 实验现象如下:

有关2022-2-23作业的更多相关文章

  1. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. ruby - 脚本在命令行中成功执行但不是作为 cron 作业 - 2

    我有一个bash脚本,它运行一个ruby​​脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案

  4. ruby - 在 RVM env 的 Ruby cron 作业中找不到 Gem - 2

    我正在尝试在RVM环境中运行10.5的旧PPC机器上运行一个简单的ruby​​脚本。在SO上搜索,我遵循了这个post中选择的答案.这是cron中的结果行:SHELL=/bin/bash00****BASH_ENV=~/.bash_profile&&/bin/bash-c'~/deggy/onlineGW.rb'此命令在用户sam的根目录下的Bash中运行良好。这是我脚本的重要部分:#!/usr/bin/envrubyrequire'open-uri'require'nokogiri'...这是cron的错误输出:X-Cron-Env:X-Cron-Env:X-Cron-Env:X-C

  5. ruby-on-rails - delayed_job 作为守护进程运行时作业失败。使用 rake 作业时运行良好 :work - 2

    我实在是无计可施了。我不明白为什么它不起作用。我创建了一个类,我使用rake命令对其进行调用和排队。当我使用“rakejobs:work”运行worker并调用命令“rakeget_updates”时,它执行得很好。但是,当我将worker作为守护进程运行时(RAILS_ENV=productionbin/delayed_jobstart)并调用命令“rakeget_updates”时,它会产生错误。app/workers/get_updates.rbclassGetUpdatesdefperformbeginning=Time.nowincludeSoapHelperrequire'

  6. ruby-on-rails - 如何将自定义 delayed_job 作业与 ActiveJob 一起使用? - 2

    我正在使用DelayedJob,我想更新我的Rails4.2应用程序以使用ActiveJob。问题是我有一堆看起来像这样的自定义作业:AssetDeleteJob=Struct.new(:user_id,:params)dodefperform#codeend#moremethodsn'stuffend然后在某处的Controller中,作业使用以下语法排队:@asset_delete_job=AssetDeleteJob.new(current_admin_user.id,params)Delayed::Job.enqueue@asset_delete_job我想找到ActiveJo

  7. ruby-on-rails - rails3 中 cron 作业的解决方案 - 2

    我尝试每天在我的Rails应用程序中自动记录一些数据。我想知道是否有人知道一个好的解决方案?我找到了https://github.com/javan/whenever,但我想确保在选择之前了解所有选项。谢谢!艾略特 最佳答案 我真的很喜欢whenever-这是一个很棒的Gem,我已经在生产中使用了它。关于它还有一个很好的Railscasts插曲:http://railscasts.com/episodes/164-cron-in-ruby 关于ruby-on-rails-rails3中c

  8. ruby - 如何在特定队列中推送作业并使用 sidekiq 限制工作人员数量? - 2

    我知道我们可以做到:sidekiq_optionsqueue:"Foo"但在这种情况下,Worker只分配给一个队列:“Foo”。我需要在特定队列中分配作业(而不是worker)。使用Resque很容易:Resque.enqueue_to(queue_name,my_job)另外,为了并发问题,我需要限制每个队列的Worker数量为1。我该怎么做? 最佳答案 您可能会使用https://github.com/brainopia/sidekiq-limit_fetch然后:Sidekiq::Client.push({'class'=>

  9. 网页设计期末作业,基于HTML+CSS+JavaScript超酷超炫的汽车类企业网站(6页) - 2

    🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;

  10. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

随机推荐