技术专栏
新唐cortex-m0之RS485通讯
如果大家用的新唐的板子的话,而又要用485通讯功能,一定会去参考自带的UART_DEMO示例程序。新唐的实例程序分为两种类型,一种就是寄存器版本的,一种叫做API版本的。如果用API写程序的同仁们,一定会非常欣慰,因为这个示例程序就是485的,只要改改就行了,而用寄存器版本写程序的一定非常苦恼(笔者就是一直用寄存器版本的写程序),因为它就是一个普通的UART通讯功能,很多人会想着看看API的版本的,慢慢翻译成寄存器版本的,但是两者有些区别,经过这两天的深入,我已经把API版本改成了寄存器版本,改的是面目全非,因为我的初始化代码几乎和API的版本的一样,但是它能运行出结果,而我不行,这如何不叫人纠结呢?
在新唐的两个版本中,有这样两个区别,大家需要注意的:
- API版本中,用的UART时钟是内部的22MHZ的晶振,大家一定看到了算晶振的波特率的函数,所以没有深入看,只知道可以得出自己想要的晶振就可以了(一般用9600的波特率),而寄存器版本中用的还是外部的12MHZ晶振
- 第二个不同的地方也是我纠结了3个星期终于发现了,也是我的问题所在的,就是API版本中,配置了管脚为RTS0功能,而寄存器版本中没有,所以即使后面初始化和API非常相似,也出不来结果,这是一个很重要的原因!(RTS0功能就是自动方向控制,是485中用来控制收发的)
解决了这两个问题,485通讯来说,基本就可以平坦大道了,但是这样说也许很空虚,下面附上485的电路图和485初始化的寄存器版本的代码,希望对大家有帮助,只是新唐Cortex-M0的代码,如果不是这个芯片的可以看看步骤,应该也没有什么太大问题。
如下图就是RS85通讯的电路图:
下面是代码部分:
#define UARTClkSource_in22MHZ (CLKSEL1 = ((CLKSEL1 & (~UART_CLK)) | UART_22M))
#define UART0_Clock_EN APBCLK |= UART0_CLKEN // Enable UART0 clock
void UART_Init(void)
{
/* Step 1. GPIO initial */
P3_MFP &= ~(P31_TXD0 | P30_RXD0);
P3_MFP |= (TXD0 | RXD0); //P3.0 --> UART0 RX
//P3.1 --> UART0 TX
P0_MFP &= ~(P03_AD3_RTS0 | P02_AD2_CTS0);
P0_MFP |= (RTS0 | CTS0); //P0.3---->RTS0自动方向控制
//这里就是配置的地方,笔者就是这里错了,导致了3个星期没有出来,
/* Step 2. Enable and Select UART clock source */
UART0_Clock_EN; //UART Clock Enable, APBCLK[16]:1
//UARTClkSource_ex12MHZ; //UART Clock is ext12MHz, CLKSEL1[25,24]: 00
UARTClkSource_in22MHZ; //使用内部22MHZ晶振
CLKDIV &= ~(15<<8); //UART Clock DIV Number = 0;
/* Step 3. Select Operation mode */
IPRSTC2 |= UART0_RST; //Reset UART0
IPRSTC2 &= ~UART0_RST; //Reset end
UA0_FCR |= TX_RST; //Tx FIFO Reset
UA0_FCR |= RX_RST; //Rx FIFO Reset
UA0_FCR |= RFITL_1; //设置为1个字节触发中断
UA0_LCR &= (~SPE);
UA0_LCR &= (~EPE);
UA0_LCR &= (~PBE); //Parity Bit Disable 校验禁止
UA0_LCR &= ~WLS;
UA0_LCR |= WL_8BIT; //8 bits Data Length 8位长度
UA0_LCR &= NSB_ONE; //1 stop bit 1位停止位
/* Step 4. Set BaudRate to 115200*/
//UA0_BAUD |= DIV_X_EN; //Mode2:DIV_X_EN = 1
//UA0_BAUD |= DIV_X_ONE; //Mode2:DIV_X_ONE =1
//上面是使用12M晶振的波特率设置
//下面的是使用22M晶振波特率的设置
UA0_BAUD &= (~(1<<29)); // UA0_BAUD |= (1<< 29); //Mode2:DIV_X_EN = 1
UA0_BAUD &= (~(1<< 28)); // UA0_BAUD |= (1<< 28); //Mode2:DIV_X_ONE =1
/* For XTAL = 12 MHz */
//UA0_BAUD |= ((12000000 / 9600) -2); //Set BaudRate to 115200; UART_CLK/(A+2) =
//115200, UART_CLK=12MHz
/*FOr 12MHz*/
UA0_BAUD |= ( 22118400UL / 9600/16 -2);
/* For XTAL = 11.0592 MHz */
//UA0_BAUD |= ((11059200 / 115200) -2); //Set BaudRate to 115200;
//UART_CLK/(A+2) = 115200, UART_CLK=12MHz
}
void initRS485(void) { UA0_FUN_SEL = RS485_EN; //设置为485功能 UA0_FCR |= (RX_DIS); //禁止接收器接受
UA0_RS485_CSR |= RS485_NMM; //设置为485普通操作模式 UA0_RS485_CSR |= RS485_AUD; //设置为控制自动方向模式
/* 开启UART0中断 */ UA0_IER |= RDA_IEN; //开启可接受数据中断和 UA0_IER |= RLS_IEN; //接收器上中断状态使能,是一个错误中断,见M0手册
NVIC_ISER |= UART0_INT; // NVIC_IPR3 |= UART0_PRI0; //设置优先级为3(最小优先级) }
void initRS485(void)
{
UA0_FUN_SEL = RS485_EN; //设置为485功能
UA0_FCR |= (RX_DIS); //禁止接收器接受
UA0_RS485_CSR |= RS485_NMM; //设置为485普通操作模式
UA0_RS485_CSR |= RS485_AUD; //设置为控制自动方向模式
// UA0_IER |= AUTO_RTS_EN;
// UA0_FCR |= RTS_TRI_4;
// UA0_MCR |= (LEV_RTS_H); //设置RTS为1,使能485驱动器
/* 开启UART0中断 */
UA0_IER |= RDA_IEN; //开启可接受数据中断和
UA0_IER |= RLS_IEN; //接收器上中断状态使能
NVIC_ISER |= UART0_INT;
// NVIC_IPR3 |= UART0_PRI0; //设置优先级为3(最小优先级)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
<
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包

相关专栏
-
浏览量:2289次2020-08-17 19:49:28
-
浏览量:3398次2020-08-13 11:43:30
-
浏览量:6882次2020-08-15 17:22:26
-
浏览量:5509次2022-07-21 14:02:50
-
浏览量:3494次2020-08-10 19:30:45
-
浏览量:7468次2022-07-25 17:32:34
-
浏览量:1728次2020-05-08 10:55:14
-
浏览量:1163次2024-07-15 11:57:20
-
浏览量:1035次2023-06-12 14:17:54
-
浏览量:3062次2020-11-27 10:06:38
-
浏览量:4612次2019-09-09 16:52:23
-
浏览量:2260次2020-07-29 13:52:11
-
浏览量:2619次2024-05-17 12:55:02
-
浏览量:6706次2022-05-10 12:41:18
-
浏览量:6195次2022-01-26 09:00:16
-
浏览量:2221次2019-11-18 14:31:41
-
浏览量:4189次2021-07-30 15:02:12
-
浏览量:2684次2020-08-14 15:09:41
-
浏览量:5049次2020-08-15 17:29:07
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者

在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注