Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mcu_support_package/inc/stm32f10x.h"
- static uint8_t Buffer = 0; //Буфер приемника
- static uint8_t Mess[5]; //сообщение-запрос
- static uint8_t Reply[4] = {0xAA,0xCC,0,0}; //сообщение-ответ
- static uint8_t count = 0; //счетчик, который соответствует количеству полученных правильных запросов
- static uint16_t Freq = 0; //частота динамика
- void ProcessingRequest(void); //функция обработки запроса
- void ProcessingReply(void) ;//функция обработки ответа
- void USART2_IRQHandler(void)
- {
- static uint8_t irep = 1; //счетчик элементов ответа
- if(USART_GetITStatus(USART2, USART_IT_TC) == SET) //Прерывание окончанию передачи
- {
- USART_SendData(USART2, Reply[irep]);
- irep++;
- if (irep>3)
- {
- irep=1;
- USART_ITConfig(USART2, USART_IT_TC, DISABLE); //Передали, выключаем прерывание по передаче
- }
- }
- else
- {
- Buffer = USART_ReceiveData(USART2);
- }
- }
- void SysTick_Handler(void) //для динамика
- {
- //GPIOA->ODR^=GPIO_Pin_6;
- static uint8_t a = 1; //для инверсии включения динамика
- static uint8_t k = 1; //счетчик прерываний
- static uint8_t f = 0; //коэффицент(когда подавать напряжение на динамик)
- f=1000/Freq;
- if(k == f)
- {
- if (a==1)
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_6);
- }
- else
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_6);
- }
- a=~a;
- k=0;
- }
- k++;
- if (k>=254)
- {
- k=1; //обновляем счетчик, чтобы он не переполнился
- }
- }
- int main(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //UART1 на выводах РА2(tx) и РА3(rx), динамик PA4
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Затактировали UART2
- GPIO_InitTypeDef gpioStruct;
- gpioStruct.GPIO_Mode = GPIO_Mode_Out_PP; //динамик
- gpioStruct.GPIO_Pin = GPIO_Pin_6;
- gpioStruct.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init(GPIOA, &gpioStruct);
- gpioStruct.GPIO_Mode = GPIO_Mode_AF_PP; //РА2(tx)
- gpioStruct.GPIO_Pin = GPIO_Pin_2;
- GPIO_Init(GPIOA, &gpioStruct);
- gpioStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //РА3(rx)
- gpioStruct.GPIO_Pin = GPIO_Pin_3;
- GPIO_Init(GPIOA, &gpioStruct);
- USART_InitTypeDef UARTStruct; //Настройка UART
- UARTStruct.USART_BaudRate = 57600;
- UARTStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- UARTStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- UARTStruct.USART_Parity = USART_Parity_No;
- UARTStruct.USART_StopBits = USART_StopBits_1;
- UARTStruct.USART_WordLength = USART_WordLength_8b;
- USART_Init(USART2, &UARTStruct); //Инициализация
- USART_Cmd(USART2, ENABLE); //Включение UART
- __disable_irq();
- SysTick_Config((SystemCoreClock/10000)-1);
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //Прерывание по факту приема данных
- NVIC_EnableIRQ(USART2_IRQn);
- __enable_irq();
- while(1)
- {
- ProcessingRequest();
- }
- return 0;
- }
- void ProcessingRequest(void) //функция обработки запроса
- {
- static uint8_t Buf = 0; //предыдущее значение буфера
- static int chsum = 0; //теоретическая контрольная сумма
- if (Buf!=Buffer) //если значение буфера изменилось
- {
- Buf=Buffer;
- //Freq=Buffer;
- SysTick_Config((SystemCoreClock/(Freq*2))-1);
- for(int i=0; i<4; i++)
- {
- Mess[i]=Mess[i+1];
- }
- Mess[4]=Buffer;
- chsum=(Mess[0]+Mess[1]+Mess[2]+Mess[3])%256;
- if(Mess[0]==0xBB&&Mess[1]==0xCC&&Mess[4]==chsum)
- {
- count++; //пополняем счетчик, который соответствует количеству полученных правильных запросов
- if(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == SET)
- {
- ProcessingReply (); //обрабатывает ответ
- USART_SendData(USART2, Reply[0]);
- USART_ITConfig(USART2, USART_IT_TC, ENABLE); //так как отправили только четверть, включаем прерывания по передаче
- }
- Freq=(Mess[3]<<8) + Mess[2]; //считываем частоту
- }
- }
- }
- void ProcessingReply(void) //функция обработки ответа
- {
- Reply[2]=count;
- Reply[3]=(0xAA+0xCC+count)%256;
- if (count>=254)
- {
- count=0; //обнуляем счетчик, чтобы он не переполнился
- }
- }
- // В Project->Options->Linker, Scatter File выбран файл stack_protection.sct
- // он обеспечивает падение в HardFault при переполнении стека
- // Из-за этого может выдаваться ложное предупреждение "AppData\Local\Temp\p2830-2(34): warning: #1-D: last line of file ends without a newline"
- #ifdef USE_FULL_ASSERT
- // эта функция вызывается, если assert_param обнаружил ошибку
- void assert_failed(uint8_t * file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- (void)file;
- (void)line;
- __disable_irq();
- while(1)
- {
- // это ассемблерная инструкция "отладчик, стой тут"
- // если вы попали сюда, значит вы ошиблись в параметрах вызова функции из SPL.
- // Смотрите в call stack, чтобы найти ее
- __BKPT(0xAB);
- }
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement