Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "main.h"
- unsigned int seg[] = {0x7E00, 0x3000, 0x6D00, 0x7900, 0x3300, 0x5B00, 0x5F00, 0x7000, 0x7F00, 0x7B00};
- char RxBuffer[RX_BUFF_SIZE]; //буфер приема USART
- char TxBuffer[TX_BUFF_SIZE]; //буффер передачи USART
- bool ComReceived; //флаг приема строки
- uint16_t current = 0x7E00;
- uint16_t tseg = 1;
- void USART2_IRQHandler(void)
- {
- char tmp;
- if ((USART2->SR & USART_SR_RXNE)!=0) // узнаем что прерывание по приему байта
- {
- tmp=USART2->DR;
- if (tmp==0x0D) //проверяем конец ли строки
- {
- ComReceived=true; //выставляем флаг приема строки
- return;
- }
- RxBuffer[strlen(RxBuffer)] = tmp; //ДОБАВЛЯЕМ В БУФФЕР если не конец строки
- }
- }
- void initPorts(void)
- {
- //RCC->APB2ENR |= RCC_APB2ENR_IOPDEN; //тактируем порт D
- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //тактируем порт A
- RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //тактируем порт B
- // настраиваем семисегментник
- GPIOB->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8);
- GPIOB->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
- GPIOB->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10);
- GPIOB->CRH &= ~(GPIO_CRH_MODE11 | GPIO_CRH_CNF11);
- GPIOB->CRH &= ~(GPIO_CRH_MODE12 | GPIO_CRH_CNF12);
- GPIOB->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
- GPIOB->CRH &= ~(GPIO_CRH_MODE14 | GPIO_CRH_CNF14);
- GPIOB->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1; //0011 (настраиваем семисегментник
- GPIOB->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;
- GPIOB->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1;
- GPIOB->CRH |= GPIO_CRH_MODE11_0 | GPIO_CRH_MODE11_1;
- GPIOB->CRH |= GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1;
- GPIOB->CRH |= GPIO_CRH_MODE13_0 | GPIO_CRH_MODE13_1;
- GPIOB->CRH |= GPIO_CRH_MODE14_0 | GPIO_CRH_MODE14_1;
- }
- /**
- */
- void initUART2(void)
- {
- /*UART2 Remapped - PD5-TX, PD6-RX */
- RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //включаем тактирование альтернативных функций
- RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //включаем тактирование UART2
- GPIOA->CRL &= ~(GPIO_CRL_MODE2 | GPIO_CRL_CNF2); //TX
- GPIOA->CRL |= (GPIO_CRL_MODE2_1 | GPIO_CRL_CNF2_1);
- GPIOA->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3); //RХ
- GPIOA->CRL |= GPIO_CRL_CNF3_0;
- /*****************************************
- 1. USARTDIV = 36000000/(16*115200) = 19.5
- 2. 19 = 0x13
- 3. 16*0.5 = 8
- 4. 0x138
- *****************************************/
- USART2->BRR = 0x4E2;
- USART2->CR2 = 0;
- USART2->CR1 = 0;
- USART2->CR1 |= USART_CR1_RE | USART_CR1_TE | USART_CR1_UE;
- USART2->CR1 |= USART_CR1_RXNEIE; //разрешаем прерывание по приему данных
- NVIC_EnableIRQ(USART2_IRQn); //разрешаем прерывание от USART2
- NVIC_SetPriority(USART2_IRQn, 0);
- }
- void txStr(char *str) //передача по USART2
- {
- uint16_t i;
- strcat(str,"\r");
- strcat(str,"\n"); //добавляем символ конца строки
- for (i = 0; i < strlen(str); i++)
- {
- USART2->DR = str[i]; //отправляем байт в регистр DR
- while ((USART2->SR & USART_SR_TC)==0) {}; //ждем окончание передачи
- }
- }
- void initOutputPorts(void)
- {
- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_AFIOEN;
- 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;
- }
- void setnumber(uint16_t i){
- switch(i){
- case 0:
- GPIOB->ODR = 0x7E00;
- current = 0x7E00;
- break;
- case 1:
- GPIOB->ODR = 0x3000;
- current = 0x3000;
- break;
- case 2:
- GPIOB->ODR = 0x6D00;
- current = 0x6D00;
- break;
- case 3:
- GPIOB->ODR = 0x7900;
- current = 0x7900;
- break;
- case 4:
- GPIOB->ODR = 0x3300;
- current = 0x3300;
- break;
- case 5:
- GPIOB->ODR = 0x5B00;
- current = 0x5B00;
- break;
- case 6:
- GPIOB->ODR = 0x5F00;
- current = 0x5F00;
- break;
- case 7:
- GPIOB->ODR = 0x7000;
- current = 0x7000;
- break;
- case 8:
- GPIOB->ODR = 0x7F00;
- current = 0x7F00;
- break;
- case 9:
- GPIOB->ODR = 0x7B00;
- current = 0x7B00;
- 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 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 ExecuteCommand(void)
- {
- txStr(TxBuffer);
- memset(RxBuffer,0,RX_BUFF_SIZE); //очищаем буффер
- ComReceived = false; //сбрасываем флаг
- }
- void initTIM6(void)
- {
- RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; //Включить тактирование TIM6
- //Частота APB1 для таймеров = 24МГц
- TIM6->PSC = 12000-1; //Предделитель частоты (24МГц/12000 = 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)
- {
- initPorts();
- initUART2();
- initTIM6();
- initButtons();
- initOutputPorts();
- while(1)
- {
- if (ComReceived)
- {
- memset(TxBuffer,0,TX_BUFF_SIZE);
- if(strcmp(RxBuffer, "*IDN?")==0)
- {
- strcpy(TxBuffer, "iu4-72 Yasinsky,Sokolov");
- ExecuteCommand();
- }
- else if(strcmp(RxBuffer, "0")==0)
- {
- GPIOB->ODR = seg[0];
- current = seg[0];
- }
- else if(strcmp(RxBuffer, "1")==0)
- {
- GPIOB->ODR = seg[1];
- current = seg[1];
- }
- else if(strcmp(RxBuffer, "2")==0)
- {
- GPIOB->ODR = seg[2];
- current = seg[2];
- }
- else if(strcmp(RxBuffer, "3")==0)
- {
- GPIOB->ODR = seg[3];
- current = seg[3];
- }
- else if(strcmp(RxBuffer, "4")==0)
- {
- GPIOB->ODR = seg[4];
- current = seg[4];
- }
- else if(strcmp(RxBuffer, "5")==0)
- {
- GPIOB->ODR = seg[5];
- current = seg[5];
- }
- else if(strcmp(RxBuffer, "6")==0)
- {
- GPIOB->ODR = seg[6];
- current = seg[6];
- }
- else if(strcmp(RxBuffer, "7")==0)
- {
- GPIOB->ODR = seg[7];
- current =seg[7];
- }
- else if(strcmp(RxBuffer, "8")==0)
- {
- GPIOB->ODR = seg[8];
- current = seg[8];
- }
- else if(strcmp(RxBuffer, "9")==0)
- {
- GPIOB->ODR = seg[9];
- current = seg[9];
- }
- else
- {
- strcpy(TxBuffer,"wrong");
- ExecuteCommand();
- }
- memset(RxBuffer,0,RX_BUFF_SIZE);
- ComReceived = false;
- }
- }
- }
- /**
- */
- void delay(uint32_t takts)
- {
- uint32_t i;
- for (i = 0; i < takts; i++) {};
- }
- void TIM6_DAC_IRQHandler(void)
- {
- TIM6->SR &= ~TIM_SR_UIF; //Сброс флага переполнения
- if (tseg == 1) { //Если светодиод LED2 включен,
- tseg = 0;
- GPIOB->ODR = 0x0;
- }
- else{ //Если нет -
- GPIOB->ODR = current;//включаем!
- tseg = 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement