Пт ноя 18, 2011 19:02:28
int main(void)
{
HardwareInit();
while(1)
{
if(rx)
{
rx=0;
tx_end=0;
USART1->CR1 &= ~USART_CR1_RXNEIE;
USART1->CR1 |= USART_CR1_TCIE;
RS485_TR; //переключаем на передачу
USART1->DR = temp;
}
if(tx_end)
{
tx_end=0;
RS485_RS; //переключаем на прием
USART1->CR1 |= USART_CR1_RXNEIE;
USART1->CR1 &= ~USART_CR1_TCIE;
}
}
}
/***** Инициализация USART1 *****/
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // enable clock for USART1
RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; //Alternate Function I/O clock enable
// 32,768 МГц/16*9600 => 213.33..
//USART1->BRR = (213 << 4) + 5;
// 32,768 МГц/16*115200 => 17.7..
USART1->BRR = (17 << 4) + 12;
USART1->CR1 |= USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; //USART Enable; RXNE Interrupt Enable; Transmitter Enable; Receiver Enable
//USART1->CR2 no init, 1 stopbit by default
//USART1->CR3 |= USART_CR3_EIE; //Error Interrupt Enable
USART1->DR = 0x00; //очищаем регистр данных
RS485_RS; //переключаем драйвер RS485 на прием
/********************************/
/** раздача приоритетов прерываний **/
__enable_irq(); // глобальное включение прерывания
NVIC_EnableIRQ(USART1_IRQn); // прерывание по USART
NVIC_SetPriority(USART1_IRQn, 0); // поумолчанию приоритет 0, самый высокий
NVIC_EnableIRQ(TIM2_IRQn); // прерывание по таймеру2
NVIC_SetPriority(TIM2_IRQn, 1); // приоритет после UART
/************************************/
void USART1_IRQHandler (void)
{
//Receive Data register not empty interrupt
if(USART1->SR & USART_SR_RXNE){
rx=1;
USART1->SR&=~USART_SR_RXNE;
temp=USART1->DR;
}
//Transmission complete interrupt
if(USART1->SR & USART_SR_TC){
USART1->SR &= ~USART_SR_TC;
tx_end=1;
}
}
Вт ноя 22, 2011 14:12:51
Вт ноя 22, 2011 14:24:08
GYUR22 писал(а):http://we.easyelectronics.ru/STM32/stm32-rs-485-modbus-rtu.html
Чт ноя 24, 2011 01:24:32
Вт ноя 29, 2011 21:42:16
Вт ноя 29, 2011 22:41:43
GYUR22 писал(а):используйте драйвер rs485 на 3вольта например sp3485
Чт дек 01, 2011 17:16:35
Чт дек 27, 2012 06:09:01