Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f10x.h"
- #define DELAY_VAL 1000
- void delay(uint32_t takts);
- void setnumber(uint16_t i);
- void initButtons(void);
- void initOutputPorts(void);
- void initTIM6(void);
- void delay(uint32_t takts);
- uint16_t seg = 1;
- uint16_t i ;
- uint16_t current = 0x0;
- void setnumber(uint16_t i){
- switch(i){
- case 0:
- GPIOA->ODR = 0x7E;
- current = 0x0;
- break;
- case 1:
- GPIOA->ODR = 0x30;
- current = 0x01;
- break;
- case 2:
- GPIOA->ODR = 0x6D;
- current = 0x02;
- break;
- case 3:
- GPIOA->ODR = 0x79;
- current = 0x03;
- break;
- case 4:
- GPIOA->ODR = 0x33;
- current = 0x04;
- break;
- case 5:
- GPIOA->ODR = 0x5B;
- current = 0x05;
- break;
- case 6:
- GPIOA->ODR = 0x5F;
- current = 0x06;
- break;
- case 7:
- GPIOA->ODR = 0x70;
- current = 0x07;
- break;
- case 8:
- GPIOA->ODR = 0x7F;
- current = 0x08;
- break;
- case 9:
- GPIOA->ODR = 0x7B;
- current = 0x09;
- break;
- }
- }
- void EXTI2_IRQHandler(void)
- {
- delay(DELAY_VAL);
- GPIOC->BSRR=GPIO_BSRR_BS12;
- if(GPIOC->IDR & GPIO_IDR_IDR2 ){
- setnumber(0x03);
- }
- GPIOC->BRR=GPIO_BRR_BR12;
- GPIOC->BSRR=GPIO_BSRR_BS11;
- if(GPIOC->IDR & GPIO_IDR_IDR2 ){
- setnumber(0x06);
- }
- GPIOC->BRR=GPIO_BRR_BR11;
- GPIOC->BSRR=GPIO_BSRR_BS10;
- if(GPIOC->IDR & GPIO_IDR_IDR2 ){
- setnumber(0x09);
- }
- GPIOC->BRR=GPIO_BRR_BR10;
- GPIOC->BSRR=GPIO_BSRR_BS9;
- if(GPIOC->IDR & GPIO_IDR_IDR2 ){
- setnumber(0x00);
- }
- GPIOC->BRR=GPIO_BRR_BR9;
- EXTI->PR|=EXTI_PR_PR2; //сбрасываем флаг прерывания
- }
- void EXTI1_IRQHandler(void)
- {
- delay(DELAY_VAL);
- GPIOC->BSRR=GPIO_BSRR_BS12;
- if(GPIOC->IDR & GPIO_IDR_IDR1 ){
- setnumber(0x02);
- }
- GPIOC->BSRR=GPIO_BSRR_BR12;
- GPIOC->BSRR=GPIO_BSRR_BS11;
- if(GPIOC->IDR & GPIO_IDR_IDR1 ){
- setnumber(0x05);
- }
- GPIOC->BSRR=GPIO_BSRR_BR11;
- GPIOC->BSRR=GPIO_BSRR_BS10;
- if(GPIOC->IDR & GPIO_IDR_IDR1 ){
- setnumber(0x08);
- }
- GPIOC->BSRR=GPIO_BSRR_BR10;
- GPIOC->BSRR=GPIO_BSRR_BS9;
- if(GPIOC->IDR & GPIO_IDR_IDR1 ){
- setnumber(0x00);
- }
- GPIOC->BSRR=GPIO_BSRR_BR9;
- EXTI->PR|=EXTI_PR_PR1; //сбрасываем флаг прерывания
- }
- void EXTI0_IRQHandler(void)
- {
- delay(DELAY_VAL);
- GPIOC->BSRR=GPIO_BSRR_BS12;
- if(GPIOC->IDR & GPIO_IDR_IDR0 ){
- setnumber(0x01);
- }
- GPIOC->BSRR=GPIO_BSRR_BR12;
- GPIOC->BSRR=GPIO_BSRR_BS11;
- if(GPIOC->IDR & GPIO_IDR_IDR0 ){
- setnumber(0x04);
- }
- GPIOC->BSRR=GPIO_BSRR_BR11;
- GPIOC->BSRR=GPIO_BSRR_BS10;
- if(GPIOC->IDR & GPIO_IDR_IDR0 ){
- setnumber(0x07);
- }
- GPIOC->BSRR=GPIO_BSRR_BR10;
- GPIOC->BSRR=GPIO_BSRR_BS9;
- if(GPIOC->IDR & GPIO_IDR_IDR0 ){
- setnumber(0x00);
- }
- GPIOC->BSRR=GPIO_BSRR_BR9;
- EXTI->PR|=EXTI_PR_PR0; //сбрасываем флаг прерывания
- }
- void TIM6_DAC_IRQHandler(void)
- {
- TIM6->SR &= ~TIM_SR_UIF; //Сброс флага переполнения
- if (seg == 1) { //Если светодиод LED2 включен,
- seg = 0;
- GPIOA->ODR = 0x0;
- }
- else{ //Если нет -
- setnumber(current);//включаем!
- seg = 1;
- }
- }
- void initButtons(void){
- RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN; //ТАКТИРУЕМ ПОРТ С И ПОДКЛЮЧАЕМ АЛЬТЕРНАТИВНЫЕ ФУНКЦИИ
- GPIOC->CRL = 0;
- // PC1
- //зануляем режим работы выхода
- GPIOC->CRL |= GPIO_CRL_CNF1_1; //устанавливаем в режим 1000(пул ап\пул довн)
- GPIOC->BSRR|=GPIO_BSRR_BS1; //выставляем ножку в 1
- AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI1_PC; // регистрация PC1 - вх. данные для прерывания
- EXTI->FTSR |= EXTI_FTSR_TR1; //прерывание по спаду импульса
- EXTI->IMR |= EXTI_IMR_MR1; //активация прерывания по первой линии(PA1...PG1)
- NVIC_EnableIRQ(EXTI1_IRQn); // разрешаем прерывание
- NVIC_SetPriority(EXTI1_IRQn, 0);// устанавливаем приоритет
- //PC0
- GPIOC->CRL |= GPIO_CRL_CNF0_1;
- GPIOC->BSRR|=GPIO_BSRR_BS0;
- AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PC;
- EXTI->FTSR |= EXTI_FTSR_TR0;
- EXTI->IMR |= EXTI_IMR_MR0;
- NVIC_EnableIRQ(EXTI0_IRQn);
- NVIC_SetPriority(EXTI0_IRQn, 0);
- //PC2
- GPIOC->CRL |= GPIO_CRL_CNF2_1;
- GPIOC->BSRR|=GPIO_BSRR_BS2;
- AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI2_PC;
- EXTI->FTSR |= EXTI_FTSR_TR2;
- EXTI->IMR |= EXTI_IMR_MR2;
- NVIC_EnableIRQ(EXTI2_IRQn);
- NVIC_SetPriority(EXTI2_IRQn, 0);
- }
- void initOutputPorts(void)
- {
- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_AFIOEN;
- GPIOA->CRL &= ~(GPIO_CRL_MODE | GPIO_CRL_CNF);
- GPIOC->CRH &= ~(GPIO_CRH_MODE | GPIO_CRH_CNF);
- GPIOC->CRH |= GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1; //включаем режим 0011 на порте C на 12 11 10 9 ножке
- GPIOC->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_MODE11_1;
- GPIOC->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
- GPIOC->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;
- GPIOC->BSRR|=GPIO_BSRR_BR12;
- GPIOC->BSRR|=GPIO_BSRR_BR11;
- GPIOC->BSRR|=GPIO_BSRR_BR10;
- GPIOC->BSRR|=GPIO_BSRR_BR9;
- GPIOA->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1; //включаем режим 0011
- GPIOA->CRL |= GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1;
- GPIOA->CRL |= GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1;
- GPIOA->CRL |= GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1;
- GPIOA->CRL |= GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1;
- GPIOA->CRL |= GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1;
- GPIOA->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1;
- }
- void initTIM6(void)
- {
- RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //Включить тактирование TIM6
- //Частота APB1 для таймеров = APB1Clk * 2 = 36МГц * 2 = 72МГц
- TIM6->PSC = 12000-1; //Предделитель частоты (72МГц/36000 = 2кГц)
- TIM6->ARR = 2000-1; //Модуль счёта таймера (2кГц/2000 = 1с)
- TIM6->DIER |= TIM_DIER_UIE; //Разрешить прерывание по переполнению таймера
- TIM6->CR1 |= TIM_CR1_CEN; //Включить таймер
- NVIC_EnableIRQ(TIM6_DAC_IRQn); //Рарзрешить прерывание от TIM6
- NVIC_SetPriority(TIM6_DAC_IRQn, 1); //Выставляем приоритет
- }
- int main(void)
- {
- /*Инициализации */
- initOutputPorts();
- initTIM6();
- initButtons();
- while(1){
- }
- }
- void delay(uint32_t takts)
- {
- uint32_t i;
- for (i = 0; i < takts; i++) {};
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement