中级会员
 
- 积分
- 354
- 金钱
- 354
- 注册时间
- 2012-4-26
- 在线时间
- 70 小时
|
5金钱
本帖最后由 followme001 于 2016-2-24 08:34 编辑
我用的是战舰寄存器的,自己写了一个串口发送函数,不是用原子的printf函数,函数的功能是按一下按键KEY0,LED0状态反转,并且向串口调试助手发送+1后的数据。数据帖是9600的波特率(即每位占时间大概是104us)1位开始,8位数据,1位停止的,但为什么用逻辑分析仪抓数据时,却发现停止位是两位的,0x01后面的停止位是204us,即占用两位了,如下图所示,真奇怪,另外,发送函数不怎么会写,不知道写得对不对,只习惯51单片机的写法。求指点。
void uart_init(u32 pclk2,u32 baud)
{
u16 mantissa;
u16 fraction;
float temp;
temp =(float)(pclk2 * 1000000) / (16 * baud) ;
mantissa = temp;
fraction = (temp - mantissa) * 16;
mantissa <<= 4;
mantissa += fraction;
RCC->APB2ENR |= 1 << 2;
RCC->APB2ENR |= 1 << 14;
GPIOA->CRH &= 0xFFFFF00F;
GPIOA->CRH |= 0x000008B0;
RCC->APB2RSTR |= 1 << 14;
RCC->APB2RSTR &= ~(1 << 14);
USART1->BRR = mantissa;
USART1->CR1 |= 0x200C;
USART1->CR1 |= 1 << 8;
USART1->CR1 |= 1 << 5;
mynvic_init(3,3,USART1_IRQChannel,2);
}
void send_char(u8 ch)
{
while ((USART1->SR & 0x40) == 0)
{
;
}
USART1->DR = (u8)ch;
}
int main(void)
{
u8 keyval = 0;
u8 txdata = 0;
stm32_clock_init(9);
led_init();
delay_init(72);
key_init();
uart_init(72,9600);
while (1)
{
keyval = key_scan(0);
switch (keyval)
{
case 1:
LED0 = !LED0;
txdata += 1;
send_char(txdata);
txdata += 1;
send_char(txdata);
break;
default:
break;
}
}
}
|
|