Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
- void startup ( void )
- {
- __asm volatile(
- " LDR R0,=0x2001C000\n" /* set stack */
- " MOV SP,R0\n"
- " BL main\n" /* call main */
- "_exit: B .\n" /* never return */
- ) ;
- }
- #define EXTI_BASE (0x40013C00)
- #define EXTI_IMR ((volatile uint32_t *) (EXTI_BASE))
- #define EXTI_RTSR ((volatile uint32_t *) (EXTI_BASE + 8))
- #define EXTI_FTSR ((volatile uint32_t *) (EXTI_BASE + 0xC))
- #define EXTI_PR ((volatile uint32_t *) (EXTI_BASE + 0x14))
- #define NVIC_ISER0 ((unsigned int *) 0xE000E100)
- #define SCB_VTOR ((volatile unsigned int *) (0xE000ED08))
- #define SYSCFG_EXTICR1 0x40013808
- void app_init (void);
- void irq_init (void);
- unsigned char keyb(void);
- void out7seg(unsigned char c);
- void systick_irq_handler(void);
- int measure_distance(void);
- void exti_1_handler(void);
- void systick_calls(void);
- static volatile int unit = 58*10; // 58*centimeters
- static volatile int measure_delay = 100; // denotes how long delay in ms between distance measurement
- static volatile char irq_1_flag;
- static volatile char systick_flag;
- static volatile int delay_counter;
- static volatile char measuring;
- static volatile int measuring_counter;
- static volatile int measuring_result;
- #include "stm32f4xx.h"
- #include "stm32f4xx_rcc.h"
- #include "stm32f4xx_gpio.h"
- void main(void){
- app_init();
- irq_1_flag = 0;
- char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x3D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
- //out7seg(segmap[1] + 0x80);
- irq_init();
- //out7seg(segmap[2] + 0x80);
- unsigned int distance;
- //out7seg(segmap[3] + 0x80);
- measure_distance();
- delay_1mikro();
- while(1){
- //out7seg(segmap[4] + 0x80);
- //distance = measure_distance();
- if(measuring == 0){
- if (measuring_result > 15){
- measuring_result = 15;
- }
- out7seg(segmap[measuring_result]);
- delay_x_ms(measure_delay);
- measure_distance();
- }
- //out7seg(segmap[5] + 0x80);
- }
- }
- //int measure_distance(void){
- void measure_distance(void){
- //int counter = 0;
- //int distance = 0;
- //char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
- GPIO_ResetBits(GPIOE,GPIO_Pin_0);
- delay_10mikro();
- GPIO_SetBits(GPIOE,GPIO_Pin_0);
- delay_10mikro();
- GPIO_ResetBits(GPIOE,GPIO_Pin_0);
- measuring = 1;
- measuring_counter = 0;
- /*
- //while(~GPIO_ReadInputData(GPIOE) & 2){
- //}
- //while(GPIO_ReadInputData(GPIOE) & 2){
- while(irq_1_flag == 0){
- delay_1mikro();
- counter++;
- //out7seg(segmap[irq_1_flag] + 0x80);
- }
- //out7seg(segmap[2] + 0x80);
- irq_1_flag = 0;
- distance = counter/unit;
- return distance;
- */
- }
- void exti_1_handler(void){
- //out7seg(0x67 + 0x80);
- if(*EXTI_PR & 2){
- irq_1_flag = 1;
- *EXTI_PR |= 2;
- measuring = 0;
- measuring_result = measuring_counter / unit;
- }
- }
- void delay_1mikro(void){
- SysTick->CTRL = 0;
- SysTick->LOAD = (168-1);
- SysTick->VAL = 0;
- //SysTick->CTRL = 5;
- SysTick->CTRL = 7;
- // COUNTFLAG is a bit that is set to 1 when counter reaches 0.
- // It's automatically cleared when read.
- //while ((SysTick->CTRL & 0x10000) == 0);
- /*
- while(systick_flag == 0){}
- systick_flag = 0;
- SysTick->CTRL = 0;
- */
- }
- void delay_10mikro(void){
- for(int i = 0; i < 10; i++){
- delay_1mikro();
- }
- }
- void delay_x_ms(int x){
- delay_counter = 0;
- while(delay_counter < (x*1000)){
- }
- /*
- for(int i = 0; i < (x*1000); i++){
- delay_1mikro();
- }
- */
- }
- void systick_calls(void){
- delay_counter++;
- if(measuring == 1){
- measuring_counter ++;
- }
- }
- void app_init(void) {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- GPIO_InitTypeDef GPIOD_Out_InitDef;
- GPIOD_Out_InitDef.GPIO_Pin = GPIO_Pin_All;
- GPIOD_Out_InitDef.GPIO_Mode = GPIO_Mode_OUT;
- GPIOD_Out_InitDef.GPIO_OType = GPIO_OType_PP;
- GPIOD_Out_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIOD_Out_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
- //Initialize pins
- GPIO_Init(GPIOD, &GPIOD_Out_InitDef);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
- GPIO_InitTypeDef GPIOE_Out_InitDef;
- GPIOE_Out_InitDef.GPIO_Pin = GPIO_Pin_0;
- GPIOE_Out_InitDef.GPIO_Mode = GPIO_Mode_OUT;
- GPIOE_Out_InitDef.GPIO_OType = GPIO_OType_PP;
- GPIOE_Out_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIOE_Out_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
- //Initialize pins
- GPIO_Init(GPIOE, &GPIOE_Out_InitDef);
- GPIO_InitTypeDef GPIOE_In_InitDef;
- GPIOE_In_InitDef.GPIO_Pin = GPIO_Pin_1;
- GPIOE_In_InitDef.GPIO_Mode = GPIO_Mode_IN;
- GPIOE_In_InitDef.GPIO_OType = GPIO_OType_PP;
- GPIOE_In_InitDef.GPIO_PuPd = GPIO_PuPd_UP;
- GPIOE_In_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
- //Initialize pins
- GPIO_Init(GPIOE, &GPIOE_In_InitDef);
- }
- void systick_irq_handler(void){
- SysTick->CTRL = 0;
- //systick_flag = 1;
- delay_1mikro();
- systick_calls();
- }
- void irq_init(void){
- *((unsigned long *) 0x40023830) = 0x18;
- *((unsigned long *) 0x40023844) = 0x4000;
- *SCB_VTOR = 0x2001C000;
- *((void (**)(void) ) (*SCB_VTOR + 0x3C)) = systick_irq_handler;
- //*((void (**)(void) ) (*SCB_VTOR + 0x64)) = exti_3_handler;
- //*((void (**)(void) ) (*SCB_VTOR + 0x60)) = exti_2_handler;
- *((void (**)(void) ) (*SCB_VTOR + 0x5C)) = exti_1_handler;
- //*((void (**)(void) ) (*SCB_VTOR + 0x58)) = exti_0_handler;
- *((unsigned int *) SYSCFG_EXTICR1) &= ~0x00F0;
- *((unsigned int *) SYSCFG_EXTICR1) |= 0x0040;
- *EXTI_IMR |= 2;
- *EXTI_FTSR |= 2;
- *EXTI_RTSR &= ~2;
- *((unsigned int *) 0xE000E100) |= (0x80);
- }
- void out7seg(unsigned char c) {
- GPIO_ResetBits(GPIOD, GPIO_Pin_All);
- GPIO_SetBits(GPIOD, c);
- //char segmap[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x3D,0x07,0x7F,0x67,0x77,0x7C,0x39,0x5F,0x79,0x71};
- //GPIOD_ODR_LOW = c;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement